m4pl1mp/plugins/boombox_plugin.py

775 lines
46 KiB
Python
Raw Normal View History

2022-07-24 13:09:17 +00:00
# -*- coding: utf-8 -*-
##################################################################################################### SOF
2022-07-25 16:30:54 +00:00
######################################################################################################### SOF
2022-07-24 13:09:17 +00:00
import irc3
from irc3.plugins.command import command
from urllib.parse import urlparse
2022-07-25 16:30:54 +00:00
from datetime import datetime
2022-07-24 13:09:17 +00:00
from glob import glob
from typing import Type
import random
import string
import os
######################################################################################################### THE ASCII LOGO TO BE USED
MOTD="""
2022-07-27 04:40:04 +00:00
_________ _________ _________ ___ ___ _________ _________ ____ ____
| o ) / O \ / O \ | \ / | | o ) / O \ \ \_/ /
|_____O___) \_________/ \_________/ |____|____| |_____O___) \_________/ /___/%\___\\
'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BB' 'BB'
2022-07-24 13:09:17 +00:00
"""
2022-07-25 16:30:54 +00:00
######################################################################################################### BOOMBOX MAIN ENTRY
@irc3.plugin
class Plugin:
##################################################################################################### BOOMBOX MAIN INIT
def __init__(self, bot):
#################################################################################################
self.bot=bot
self.bot.diagnostic_flag=False
self.bot.bbs=BOOMBOX_CONFIG(self.bot)
################################################################################################# SOF COLOR INIT
self.bot.bbs.c=[]
self.bot.bbs.b1,self.bot.bbs.b2,self.bot.bbs.b3,self.bot.bbs.b4=self.bot.bbs.palette()[0:4]
self.bot.bbs.b5,self.bot.bbs.b6,self.bot.bbs.b7,self.bot.bbs.b8=self.bot.bbs.palette()[0:4]
################################################################################################# COLOR INIT
self.bot.bbs.sites=['soundcloud','youtube','spotify','bandcamp']
2022-07-27 04:40:04 +00:00
self.bot.bbs.floor__top_songs=15
self.bot.bbs.floor__last_songs=15
self.bot.bbs.floor__top_users=5
self.bot.bbs.floor__top_sites=len(self.bot.bbs.sites)
self.bot.bbs.ceiling__top_songs=50
self.bot.bbs.ceiling__last_songs=50
self.bot.bbs.ceiling__top_users=25
2022-07-25 16:30:54 +00:00
self.bot.bbs.ceiling__top_sites=len(self.bot.bbs.sites)
################################################################################################# EOF COLOR INIT
self.bot.bbs.bot=self.bot
################################################################################################# CHECK OR PREP DB
##################################################################################################### BOOMBOX MAIN 1
@command(permission='view',public=True, show_in_help_list=False)
def dbdo(self, mask, target, args):
"""dbdo sync
%%dbdo <noise>...
"""
noise=' '.join(args['<noise>'])
commands=noise.split()
db=noise.split()[0]
op=noise.split()[1]
data=' '.join(noise.split()[2:])
result=self.bot.bbs.dbdo(db,op,data)
##################################################################################################### BOOMBOX MAIN 1
@command(permission='view',public=True, show_in_help_list=False)
def bb(self, mask, target, args):
"""Convert boombox token to a url
%%bb <token>...
"""
c=self.bot.bbs.palette()
self.bot.bbs.c=c
token=''.join(args['<token>'])
tokens=self.bot.db.getlist("bbs_token")
url=''
for t in tokens:
if token in t:
url=t[token]
msg=f"{c[0]}{mask.nick} {c[1]}{c[2]}boombox"
if url:
title_prefetch_data=self.bot.prefetch_title(url,target,mask)
if url.find('soundcloud'):
try:
if title_prefetch_data:
title=title_prefetch_data.split('|')[0].strip().replace('Stream','').strip()
msg+=f"{c[1]}{c[4]}{title} {c[1]}{c[3]}{url}{c[1]}"
else:
msg+=f"{c[2]}url{c[1]}{c[3]}{url}"
except:
msg+=f"{c[2]}url{c[1]}{c[3]}{url}"
else:
msg+=f"{c[2]}error{c[1]}: {c[3]}{token} is an invalid token"
2022-07-25 17:17:53 +00:00
self.bot.privmsg(target,self.bot.emo(msg))
2022-07-25 16:30:54 +00:00
##################################################################################################### BOOMBOX MAIN 2
2022-07-27 04:40:04 +00:00
@command(permission='view',error_format="{cmd} error - usage: ?{cmd} all,top,old,user,site - example: ?{cmd} all".format)
2022-07-25 16:30:54 +00:00
def boombox(self, mask, target, args):
2022-07-25 17:17:53 +00:00
"""boombox
%%boombox
2022-07-25 16:30:54 +00:00
"""
2022-07-27 04:40:04 +00:00
command='all'
2022-07-25 16:30:54 +00:00
###########################################################################
2022-07-27 04:40:04 +00:00
commands=['top','old','user','site','all']
2022-07-25 16:30:54 +00:00
###########################################################################
if not command in commands:
2022-07-27 04:40:04 +00:00
msg="boombox - usage: ?boombox top, ?boombox old, ?boombox user, ?boombox site, ?boombox all"
2022-07-25 16:30:54 +00:00
self.bot.privmsg(target,self.bot.emo(msg))
return
###########################################################################
bbs_last=self.bot.db.getlist("bbs_last")
bbs_data=self.bot.db.getlist('bbs_data')
###########################################################################
2022-07-27 04:40:04 +00:00
if bbs_data:
#########################################################################################
c1,c2,c3,c4,c5,c6,c7,c8=self.bot.bbs.c
#########################################################################################f
if command=='all':
for _ in MOTD.splitlines():
if _:
self.bot.privmsg(target,f'{self.bot.bbs.palette()[0]}{_}')
#########################################################################################
if command=='top' or command=='all':
# TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP
# TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP
# TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP SONGS TOP
msg=f'TOP SONGS ◸{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸'
######################################################################################################################
self.bot.privmsg(target,msg)
bbs_data=self.bot.db.getlist('bbs_data')
hits=[]
for i,data in enumerate(bbs_data):
hits.append(data['hits'])
lot=[(k,v) for k, v in zip(range(len(hits)),hits)]
nl=[]
while len(lot)> 0:
nl.append(max(lot,key=lambda x: x[1]))
lot.remove(nl[-1])
nl[0:len(bbs_data)]
#####################################################################################
mode_length=0
if command=='top':
mode_length=self.bot.bbs.ceiling__top_songs
elif command=='all':
mode_length=self.bot.bbs.floor__top_songs
#####################################################################################
2022-07-27 05:17:33 +00:00
top_songs=[]
2022-07-27 04:40:04 +00:00
for i in range(mode_length):
2022-07-25 16:30:54 +00:00
try:
2022-07-27 04:40:04 +00:00
base=bbs_data[nl[i][0]]
except:
2022-07-25 16:30:54 +00:00
pass
2022-07-27 04:40:04 +00:00
title=base['title'].lower()
token=base['token']
url=base['url']
site=base['site']
hits=base['hits']
lot_nicks=[(k,v) for k, v in zip(range(len(base['nicks'].values())),base['nicks'].values())]
buf_nicks=[]
while len(lot_nicks)>0:
buf_nicks.append(max(lot_nicks,key=lambda x: x[1]))
lot_nicks.remove(buf_nicks[-1])
nick_hits=buf_nicks[0][1]
nick=list(base['nicks'])[buf_nicks[0][0]]
msg=f'{c4}{self.bot.bbs.tailor(title.lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site.lower(),10)} {c1}{c8}{self.bot.bbs.tailor(nick.lower(),10)} {c1}{c7}{str(nick_hits).zfill(2)}{c1}/{c7}{str(hits).zfill(2)} {c6}plays {c1}{c5}?bb {token}'
2022-07-27 05:17:33 +00:00
top_songs.append(msg)
last_song=""
for song in top_songs:
if song==last_song:
break
last_song=song
self.bot.privmsg(target,song)
2022-07-27 04:40:04 +00:00
#########################################################################################
if command=='old' or command=='all':
# OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD
# OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD
# OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD SONGS OLD
msg=f'OLD SONGS ◸{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸'
self.bot.privmsg(target,msg)
bbs_data=self.bot.db.getlist('bbs_data')
last_songs=[]
try:
for i,lastdb in enumerate(bbs_last):
nick=lastdb[0]
site=lastdb[1]
title=lastdb[2]
token=lastdb[3]
url=lastdb[4]
try:
reverse_index=self.bot.bbs.dbgaze('bbs_data','token',token)
hits=bbs_data[reverse_index]['hits']
db_key_nicks=list(zip(list(bbs_data[reverse_index]['nicks'].values()),list(bbs_data[reverse_index]['nicks'].keys())))
db_key_nicks.sort()
user=db_key_nicks[-1][1]
plays=user=db_key_nicks[-1][0]
if len(lastdb)>0:
msg=f'{c4}{self.bot.bbs.tailor(title.lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site.lower(),10)} {c1}{c8}{self.bot.bbs.tailor(nick.lower(),10)} {c1}{c7}{str(plays).zfill(2)}{c1}/{c7}{str(hits).zfill(2)} {c6}plays {c1}{c5}?bb {token}'
last_songs.append(msg)
except Exception as e:
print(f'{mask.nick}: boombox_plugin:boombox:last - error: {e}')
except Exception as e:
pass
#####################################################################################
mode_length=0
if command=='old':
mode_length=self.bot.bbs.ceiling__last_songs
elif command=='all':
mode_length=self.bot.bbs.floor__last_songs
#####################################################################################
try:
for i in range(mode_length):
self.bot.privmsg(target,last_songs[i])
except:
pass
#########################################################################################
if command=='user' or command=='all':
# TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP
# TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP
# TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP USERS TOP
msg=f'TOP USERS ◸{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸'
self.bot.privmsg(target,msg)
top_data=self.bot.db.getlist('bbs_data')
bbs_nicks=self.bot.db.getlist("bbs_nicks")
top_nicks=list(bbs_nicks[0].keys())
top_users_tally=[]; top_users=[]
for _ in [ x for x in bbs_nicks[0] ]:
top_users_tally.append(bbs_nicks[0][_]['tally'])
for _ in [ x for x in bbs_nicks[0] ]:
top_users.append(_)
userlist=list(zip(top_users_tally,top_users))
userlist.sort()
userlist.reverse()
for i,userdata in enumerate(userlist):
tally,user=userdata
top_users=[]
for _user in userlist:
top_user=_user[1]
user_hits=[]
2022-07-25 16:30:54 +00:00
for i,_ in enumerate(bbs_data):
2022-07-27 04:40:04 +00:00
try:
user_hits.append(f"{_['nicks'][_user[1]]},{i}")
except:
pass
user_hits.sort()
user_hits.reverse()
top_hits=int(user_hits[0].split(',')[0])
top_index=int(user_hits[0].split(',')[1])
top_hits_site=int(bbs_data[top_index]['hits'])
top_site=bbs_data[top_index]['site']
top_title=bbs_data[top_index]['title']
top_token=bbs_data[top_index]['token']
msg=f'{c4}{self.bot.bbs.tailor(top_title.lower(),50)} {c1}{c3}{self.bot.bbs.tailor(top_site.lower(),10)} {c1}{c8}{self.bot.bbs.tailor(top_user.lower(),10)} {c1}{c7}{str(top_hits).zfill(2)}{c1}/{c7}{str(top_hits_site).zfill(2)} {c6}plays {c1}{c5}?bb {top_token}'
top_users.append(msg)
#####################################################################################
mode_length=0
if command=='user':
mode_length=self.bot.bbs.ceiling__top_users
elif command=='all':
mode_length=self.bot.bbs.floor__top_users
#####################################################################################
try:
for i in range(mode_length):
self.bot.privmsg(target,top_users[i])
except:
pass
#########################################################################################
if command=='site' or command=='all':
# TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP
# TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP
# TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP SITES TOP
bbs_sites=self.bot.db.getlist("bbs_sites")
msg=f'TOP SITES ◸{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸'
self.bot.privmsg(target,msg)
bbs_nicks=self.bot.db.getlist('bbs_nicks')
site_nicks=list(bbs_nicks[0].keys())
site_users_bandcamp=[]; site_users_soundcloud=[];
site_users_youtube=[]; site_users_spotify=[];
for _ in [ x for x in site_nicks ]:
site_users_bandcamp.append([bbs_nicks[0][_]['bandcamp'],_])
site_users_soundcloud.append([bbs_nicks[0][_]['soundcloud'],_])
site_users_youtube.append([bbs_nicks[0][_]['youtube'],_])
site_users_spotify.append([bbs_nicks[0][_]['spotify'],_])
site_users_bandcamp.sort(); site_users_bandcamp.reverse()
site_users_soundcloud.sort(); site_users_soundcloud.reverse()
site_users_youtube.sort(); site_users_youtube.reverse()
site_users_spotify.sort(); site_users_spotify.reverse()
######################################################################################################################################################################
bandcamp_top_user_hits=[]
for i,_ in enumerate(bbs_data):
if _['site']=='bandcamp':
bandcamp_top_user_hits.append(f'{_["hits"]},{i}')
bandcamp_top_user_hits.sort()
bandcamp_top_user_hits.reverse()
bandcamp_index=int(bandcamp_top_user_hits[0].split(',')[1])
bandcamp_title=bbs_data[bandcamp_index]['title']
bandcamp_site=bbs_data[bandcamp_index]['site']
bandcamp_user=site_users_bandcamp[0][1]
bandcamp_userhits=bandcamp_top_user_hits[0].split(',')[0]
bbs_sites=self.bot.db.getlist('bbs_sites')
bandcamp_sitehits=bbs_sites[0]['bandcamp']
bandcamp_token=bbs_data[bandcamp_index]['token']
site_bandcamp=[bandcamp_title,bandcamp_site,bandcamp_user,bandcamp_userhits,bandcamp_sitehits,bandcamp_token,bandcamp_index]
######################################################################################################################################################################
soundcloud_top_user_hits=[]
for i,_ in enumerate(bbs_data):
if _['site']=='soundcloud':
soundcloud_top_user_hits.append(f'{_["hits"]},{i}')
soundcloud_top_user_hits.sort()
soundcloud_top_user_hits.reverse()
soundcloud_index=int(soundcloud_top_user_hits[0].split(',')[1])
soundcloud_title=bbs_data[soundcloud_index]['title']
soundcloud_site=bbs_data[soundcloud_index]['site']
soundcloud_user=site_users_soundcloud[0][1]
soundcloud_userhits=soundcloud_top_user_hits[0].split(',')[0]
bbs_sites=self.bot.db.getlist('bbs_sites')
soundcloud_sitehits=bbs_sites[0]['soundcloud']
soundcloud_token=bbs_data[soundcloud_index]['token']
site_soundcloud=[soundcloud_title,soundcloud_site,soundcloud_user,soundcloud_userhits,soundcloud_sitehits,soundcloud_token,soundcloud_index]
######################################################################################################################################################################
youtube_top_user_hits=[]
for i,_ in enumerate(bbs_data):
if _['site']=='youtube':
youtube_top_user_hits.append(f'{_["hits"]},{i}')
youtube_top_user_hits.sort()
youtube_top_user_hits.reverse()
youtube_index=int(youtube_top_user_hits[0].split(',')[1])
youtube_title=bbs_data[youtube_index]['title']
youtube_site=bbs_data[youtube_index]['site']
youtube_user=site_users_youtube[0][1]
youtube_userhits=youtube_top_user_hits[0].split(',')[0]
bbs_sites=self.bot.db.getlist('bbs_sites')
youtube_sitehits=bbs_sites[0]['youtube']
youtube_token=bbs_data[youtube_index]['token']
site_youtube=[youtube_title,youtube_site,youtube_user,youtube_userhits,youtube_sitehits,youtube_token,youtube_index]
######################################################################################################################################################################
spotify_top_user_hits=[]
for i,_ in enumerate(bbs_data):
if _['site']=='spotify':
spotify_top_user_hits.append(f'{_["hits"]},{i}')
spotify_top_user_hits.sort()
spotify_top_user_hits.reverse()
spotify_index=int(spotify_top_user_hits[0].split(',')[1])
spotify_title=bbs_data[spotify_index]['title']
spotify_site=bbs_data[spotify_index]['site']
spotify_user=site_users_spotify[0][1]
spotify_userhits=spotify_top_user_hits[0].split(',')[0]
bbs_sites=self.bot.db.getlist('bbs_sites')
spotify_sitehits=bbs_sites[0]['spotify']
spotify_token=bbs_data[spotify_index]['token']
site_spotify=[spotify_title,spotify_site,spotify_user,spotify_userhits,spotify_sitehits,spotify_token,spotify_index]
######################################################################################################################################################################
bbs_sites=self.bot.db.getlist("bbs_sites")
hits=[]
for i,data in enumerate(bbs_sites[0].keys()):
hits.append(bbs_sites[0][data])
lot=[(k,v) for k, v in zip(range(len(hits)),hits)]
nl=[]
while len(lot)> 0:
nl.append(max(lot,key=lambda x: x[1]))
lot.remove(nl[-1])
siteorder=[]
for i in range(len(nl)): siteorder.append(list(bbs_sites[0].keys())[nl[i][0]])
top_sites=[]
for site in siteorder:
if site=='soundcloud':
msg=f'{c4}{self.bot.bbs.tailor(site_soundcloud[0].lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site_soundcloud[1].lower(),10)} {c1}{c8}{self.bot.bbs.tailor(site_soundcloud[2].lower(),10)} {c1}{c7}{str(site_soundcloud[3]).zfill(2)}{c1}/{c7}{str(site_soundcloud[4]).zfill(2)} {c6}plays {c1}{c5}?bb {site_soundcloud[5]}'
top_sites.append(msg)
elif site=='bandcamp':
msg=f'{c4}{self.bot.bbs.tailor(site_bandcamp[0].lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site_bandcamp[1].lower(),10)} {c1}{c8}{self.bot.bbs.tailor(site_bandcamp[2].lower(),10)} {c1}{c7}{str(site_bandcamp[3]).zfill(2)}{c1}/{c7}{str(site_bandcamp[4]).zfill(2)} {c6}plays {c1}{c5}?bb {site_bandcamp[5]}'
top_sites.append(msg)
elif site=='youtube':
msg=f'{c4}{self.bot.bbs.tailor(site_youtube[0].lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site_youtube[1].lower(),10)} {c1}{c8}{self.bot.bbs.tailor(site_youtube[2].lower(),10)} {c1}{c7}{str(site_youtube[3]).zfill(2)}{c1}/{c7}{str(site_youtube[4]).zfill(2)} {c6}plays {c1}{c5}?bb {site_youtube[5]}'
top_sites.append(msg)
elif site=='spotify':
msg=f'{c4}{self.bot.bbs.tailor(site_spotify[0].lower(),50)} {c1}{c3}{self.bot.bbs.tailor(site_spotify[1].lower(),10)} {c1}{c8}{self.bot.bbs.tailor(site_spotify[2].lower(),10)} {c1}{c7}{str(site_spotify[3]).zfill(2)}{c1}/{c7}{str(site_spotify[4]).zfill(2)} {c6}plays {c1}{c5}?bb {site_spotify[5]}'
top_sites.append(msg)
#####################################################################################
mode_length=0
if command=='site':
mode_length=self.bot.bbs.ceiling__top_sites
elif command=='all':
mode_length=self.bot.bbs.floor__top_sites
#####################################################################################
try:
for i in range(mode_length):
self.bot.privmsg(target,top_sites[i])
except:
pass
2022-07-25 16:30:54 +00:00
##################################################################################################################################################################################
######################################################################################################### BOOMBOX CONFIG ENTRY
class BOOMBOX_CONFIG:
##################################################################################################### BOOMBOX CONFIG INIT
2022-07-24 13:09:17 +00:00
def __init__(self,bot):
2022-07-25 16:30:54 +00:00
self.bot=bot
self.db=[]
self.bot.bbdb=[]
self.database_names=['bbs_data','bbs_last','bbs_nicks','bbs_sites','bbs_token','bbs_tokenmirror']
print(f'\n[ database diagnostics ]\n')
for index,database in enumerate(self.database_names):
db=self.bot.db.getlist(database)
if not db:
print(f'\t- missing database{" "*19}{index+1}/{len(self.database_names)} - {self.database_names[index]}')
self.db_diagnostics(database)
else:
print(f'\t+ located database: {index+1}/{len(self.database_names)} - {self.database_names[index]}')
print(f'{"#"*80} SOF')
print(f' pre - a database name: {database}')
print(f' pre - database memory: \n{self.db}')
print(f' pre - a datbase entry: \n{db}')
print(f'post - database merged: \n{db}')
print(f'{"#"*80} EOF')
print(f'\n{"-"*80}')
for _ in self.database_names:
self.bot.bbdb.append(self.bot.db.getlist(_))
##################################################################################################### BOOMBOX CONFIG COLOR CODES
2022-07-24 13:09:17 +00:00
def color(self,c):
try:
c=str(c.lower())
if c=='0': return '\x0300'
if c=='1': return '\x0301'
if c=='2': return '\x0302'
if c=='3': return '\x0303'
if c=='4': return '\x0304'
if c=='5': return '\x0305'
if c=='6': return '\x0306'
if c=='7': return '\x0307'
if c=='8': return '\x0308'
if c=='9': return '\x0309'
if c=='a': return '\x0310'
if c=='b': return '\x0311'
if c=='c': return '\x0312'
if c=='d': return '\x0313'
if c=='e': return '\x0314'
if c=='f': return '\x0315'
if c=='n': return ''
if c=='t': return '\x0f'
print('color: empty')
return '\x0f'
except:
print('color: error')
return '\x0f'
2022-07-25 16:30:54 +00:00
##################################################################################################### BOOMBOX CONFIG COLOR SETS
2022-07-24 13:09:17 +00:00
def palette(self):
self.c=[]; self.n=[]
for i in range(0,8):
n=random.randint(0,15)
c=self.color(hex(n)[2:])
self.c.append(c); self.n.append(n)
return self.c
2022-07-25 16:30:54 +00:00
##################################################################################################### BOOMBOX CONFIG TEXT ALIGNMENTS
2022-07-24 13:09:17 +00:00
def tailor(self,s,n):
if len(s)<=n:
2022-07-25 17:17:53 +00:00
result=s+"."*(n-len(s))
2022-07-24 13:09:17 +00:00
return result
else:
return s[0:n]
2022-07-25 16:30:54 +00:00
##################################################################################################### BOOMBOX CONFIG TEXT ALIGNMENTS
def dbsync(self,db):
for i,database in enumerate(['bbs_data','bbs_last','bbs_nicks','bbs_sites','bbs_token','bbs_tokenmirror']):
if db == database:
print('breakpoint: boombox_plugin:dbsync')
try:
db_stored=self.bot.db.getlist(database)
db_memory=self.bot.bbdb[i]
if not db_memory==db_stored:
self.bot.db.setlist(database,db_memory)
print('success: storage database updated from memory')
else:
print('aborted: storage database same as memory content')
except Exception as e:
print('error: boombox_plugin:dbsync - failed in writing to storage database from memory: {e}')
##################################################################################################### BOOMBOX CONFIG TEXT ALIGNMENTS
def dbdo(self,database,operation,data=""):
database_names=(['bbs_data','bbs_last','bbs_nicks','bbs_sites','bbs_token','bbs_tokenmirror'])
operations=['get','set','update','append']
if database in database_names:
index=database_names.index(database)
if operation in operations:
if operation=="get":
return self.bot.bbdb[index]
elif operation=='set':
db_stored=self.bot.db.getlist(database)
print(f'pre:{database} db_stored: {db_stored}')
print(f'pre:{database} db_memory: {self.bot.bbdb[index]}')
print(f'pre:{database} db_sent: {data}')
self.bot.bbdb[index]=data
print(f'post:{database} db_memory: {self.bot.bbdb[index]}')
print(f'writing from memory to storage')
self.dbsync(database)
elif operation=='append':
db_stored=self.bot.db.getlist(database)
print(f'pre:{database} db_stored: {db_stored}')
print(f'pre:{database} db_memory: {self.bot.bbdb[index]}')
self.bot.bbdb[index].append(data)
print(f'post:{database} db_memory: {self.bot.bbdb[index]}')
print(f'writing from memory to storage')
self.dbsync(database)
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS
def push(self,nick,site,title,token,url):
2022-07-24 13:09:17 +00:00
nick=self.no_unicode(nick)
title=self.no_unicode(title)
2022-07-25 16:30:54 +00:00
bbs_data=self.dbdo('bbs_data','get')
bbs_last=self.dbdo('bbs_last','get')
2022-07-24 13:09:17 +00:00
bbs_last=bbs_last[-1:]+bbs_last[:-1]
2022-07-25 16:30:54 +00:00
bbs_last[0]=[nick,site,title,token,url]
self.dbdo('bbs_last','set',bbs_last)
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS
2022-07-24 13:09:17 +00:00
def check(self,nick,site,data):
#################################################################################################
2022-07-25 16:30:54 +00:00
bbs_nicks=self.dbdo('bbs_nicks','get')
bbs_sites=self.dbdo('bbs_sites','get')
bbs_data=self.dbdo('bbs_data','get')
bbs_token=self.dbdo('bbs_token','get')
bbs_tokenmirror=self.dbdo('bbs_tokenmirror','get')
2022-07-24 13:09:17 +00:00
#################################################################################################
try:
if bbs_data:
for i,_data in enumerate(bbs_data):
if data['url']==_data['url']:
_data['hits']+=1
try:
_data['nicks'][nick]+=1
except:
_data['nicks'].update({nick:1})
try:
2022-07-25 16:30:54 +00:00
bbs_nicks[0][nick]['tally']+=1
bbs_nicks[0][nick][site]+=1
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
bbs_nicks[0].update({nick:{'tally':1,'bandcamp':0,'soundcloud':0,'spotify':0,'youtube':0}})
bbs_nicks[0][nick][site]+=1
2022-07-24 13:09:17 +00:00
bbs_sites[0][site]+=1
bbs_data[i]=_data
2022-07-25 16:30:54 +00:00
self.dbdo("bbs_nicks",'set',bbs_nicks)
self.dbdo("bbs_sites",'set',bbs_sites)
self.dbdo("bbs_data",'set',bbs_data)
2022-07-24 13:09:17 +00:00
return
#########################################################################################
try:
2022-07-25 16:30:54 +00:00
bbs_nicks[0][nick]['tally']+=1
bbs_nicks[0][nick][site]+=1
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
bbs_nicks[0].update({nick:{'tally':1,'bandcamp':0,'soundcloud':0,'spotify':0,'youtube':0}})
bbs_nicks[0][nick][site]+=1
2022-07-24 13:09:17 +00:00
#########################################################################################
2022-07-25 16:30:54 +00:00
self.dbdo("bbs_nicks",'set',bbs_nicks)
2022-07-24 13:09:17 +00:00
bbs_sites[0][site]+=1
2022-07-25 16:30:54 +00:00
self.dbdo("bbs_sites",'set',bbs_sites)
2022-07-24 13:09:17 +00:00
bbs_data.append(data)
2022-07-25 16:30:54 +00:00
self.dbdo("bbs_data",'set',bbs_data)
2022-07-24 13:09:17 +00:00
URL=data['url']; TOKEN=data['token']
2022-07-25 16:30:54 +00:00
self.dbdo('bbs_token','append',{TOKEN:URL})
self.dbdo("bbs_token",'set',bbs_token)
self.dbdo('bbs_tokenmirror','append',{TOKEN:URL})
self.dbdo('bbs_tokenmirror','set',bbs_tokenmirror)
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
bbs_nicks=[]
self.dbdo('bbs_nicks','append',{nick:{'tally':1,'bandcamp':0,'soundcloud':0,'spotify':0,'youtube':0}})
bbs_nicks[0][nick][site]+=1 ############################# notice
self.dbdo('bbs_nicks','set',bbs_nicks)
self.dbdo('bbs_sites','set',[{'soundcloud':0,'youtube':0,'spotify':0,'bandcamp':0}])
bbs_sites=self.dbdo('bbs_sites','get')
bbs_sites[0][site]+=1 ################################### notice
self.dbdo('bbs_sites','set',bbs_sites)
self.dbdo('bbs_data','set',[data])
2022-07-24 13:09:17 +00:00
URL=data['url']; TOKEN=data['token']
2022-07-25 16:30:54 +00:00
self.dbdo('bbs_token',{TOKEN:URL})
self.dbdo('bbs_token','set', bbs_token)
self.dbdo('bbs_token',{TOKEN:URL})
self.dbdo('bbs_tokenmirror','append',{URL:TOKEN})
self.dbdo('bbs_tokenmirror','set',bbs_tokenmirror)
##################################################################################################### BOOMBOX CONFIG HOOKED EXTERNALS DATABASE OPERATIONS
def getsite(self,url):
#################################################################################################
sites=['soundcloud','youtube','spotify','bandcamp']
if not url.find('soundcloud.com')==-1:
return sites[0]
if not url.find('youtube.com')==-1 or not url.find('youtu.be')==-1:
return sites[1]
if not url.find('spotify.com')==-1:
return sites[2]
if not url.find('bandcamp.com')==-1:
return sites[3]
##################################################################################################### BOOMBOX CONFIG HOOKED EXTERNALS DATABASE OPERATIONS
2022-07-24 13:09:17 +00:00
def enter(self,nick,url,title):
#################################################################################################
2022-07-25 16:30:54 +00:00
timestamp=datetime.now().timestamp()
2022-07-24 13:09:17 +00:00
token=self.token(url)
2022-07-25 16:30:54 +00:00
bbs_token=self.dbdo('bbs_token','get')
2022-07-24 13:09:17 +00:00
nick=self.no_unicode(nick)
2022-07-25 16:30:54 +00:00
title=self.no_unicode(title).lower()
site=self.getsite(url)
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
data={'nicks':{nick:1},'title':title.lower(),'url':url,'token':token,'timestamp':timestamp,'site':site,'hits':1}
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
if site=='soundcloud':
title=title[:title.rfind('by')].replace('Stream','').strip().lower()
2022-07-24 13:09:17 +00:00
if not title=='SoundCloud - Hear the worlds sound':
2022-07-25 16:30:54 +00:00
data['title']=title.split('music |')[0].rstrip().lower()
2022-07-24 13:09:17 +00:00
data=self.check(nick,site,data)
2022-07-25 16:30:54 +00:00
self.push(nick.lower(),site,title.lower(),token,url)
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
if site=='youtube':
2022-07-24 13:09:17 +00:00
id=url[-11:]
result=self.bot.videos_list_by_id(id=id)
if result:
data=self.check(nick,site,data)
2022-07-25 16:30:54 +00:00
self.push(nick.lower(),site,title.lower(),token,url)
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
if site=='spotify':
2022-07-24 13:09:17 +00:00
offset=url.rfind('/')+1
try:
track=title.split('|')[0].split('- song by')[0].strip()
2022-07-27 05:08:43 +00:00
try:
artist=title.split('|')[0].split('- song by')[1].strip()
except:
artist=title.split('|')[0].split('- Album by')[0].strip()
try:
artist=title.split('|')[0].split('- Album by')[1].strip()
except:
artist=title.split('by ')[1].split(' | ')[0]
try:
track=title.split(' - ')[0]
except:
pass
2022-07-24 13:09:17 +00:00
except:
2022-07-27 05:08:43 +00:00
title=title.lower()
if track and artist:
title=f'{artist} - {track}'.lower()
2022-07-24 13:09:17 +00:00
data['title']=title
data=self.check(nick,site,data)
2022-07-25 16:30:54 +00:00
self.push(nick.lower(),site,title.lower(),token,url)
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
if site=='bandcamp':
2022-07-24 13:09:17 +00:00
offset=url.rfind('/')+1
try:
track=title.split('|')[0].lower().strip()
except:
pass
2022-07-25 16:30:54 +00:00
try:
artist=title.split('|')[1].lower().strip()
title=f'{artist} - {track}'.lower()
except:
artist=""
title=f'{artist}{track}'.lower()
data['title']=title.lower()
2022-07-24 13:09:17 +00:00
data=self.check(nick,site,data)
2022-07-25 16:30:54 +00:00
self.push(nick.lower(),site,title.lower(),token,url)
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS FOR URLS
def token(self,url):
bbs_token=self.dbdo('bbs_token','get')
bbs_tokenmirror=self.dbdo('bbs_tokenmirror','get')
S=list(string.ascii_letters+string.digits)
random.shuffle(S)
S=''.join(S)[:5]
while S in [list(x.keys())[0] for x in bbs_token]:
S=list(string.ascii_letters+string.digits)
random.shuffle(S); S=''.join(S)[:5]
return f'{S}'
##################################################################################################### BOOMBOX CONFIG TEXT FILTERING BY STRIPPING UNICODE
def no_unicode(self,s):
if len(s) < 1: return s
s=s.encode('ascii','ignore').decode()
s=s.strip().replace(' ',' ')
return s
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS - SUB-SCANNING RECORDS RETURNING CONDITIONAL BOOLEAN
def dbskim(self,db,s):
buffer=self.dbdo(db,'get')
for _ in buffer:
try:
result=_[s]
if result:
return result
except:
pass
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS - SUB-SCANNING RECORDS RETURNING CONDITIONAL BOOLEAN
def dbgaze(self,db,key,s):
buffer=self.dbdo(db,'get')
for i,_ in enumerate(buffer):
try:
result=(_[key]==s)
if result:
return i
except:
pass
##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS - AUTOMATICALLY CREATES/REPAIRS/STAGES THE DATABASES
2022-07-24 13:09:17 +00:00
@irc3.extend
2022-07-25 16:30:54 +00:00
def db_diagnostics(self,database_name,*args):
2022-07-24 13:09:17 +00:00
#####################################################################################################
2022-07-25 16:30:54 +00:00
# database_names = ['bbs_data','bbs_last','bbs_nicks','bbs_sites','bbs_token','bbs_tokenmirror']
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
index=-1
#######################################
for i, database in enumerate(self.database_names):
if database_name==database:
index=i
break
print(f"->db_diagnostics: index: {index} - database: {database_name}")
#############################################
print(f'\t\t- creating database{" "*10}{index+1}/{len(self.database_names)} - {self.database_names[index]}')
automation_flag=False
2022-07-25 17:17:53 +00:00
######################################################################## database: 0/5 - bbs_data
2022-07-25 16:30:54 +00:00
if database_name==self.database_names[0]:
2022-07-24 13:09:17 +00:00
#############################################################################################
try:
2022-07-25 16:30:54 +00:00
db=[]
db.append({'nicks':{"dr1p":1},'title':'fenix flexin - 10 toes ( dr1ph0p m1x )','url':'https://soundcloud.com/vanta_sec/fenix-flexin-10-toes-dr1ph0p-m1x','token':'06660','timestamp':1658706829.869036,'site':'soundcloud','hits':1})
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
pass
#############################################################################################
######################################################################## database: 1/5 - bbs_last
elif database_name==self.database_names[1]:
2022-07-24 13:09:17 +00:00
#############################################################################################
try:
2022-07-25 16:30:54 +00:00
db=[]
for _ in range(0,self.bot.bbs.ceiling__last_songs):
2022-07-25 17:17:53 +00:00
db.append('')
2022-07-25 16:30:54 +00:00
db.pop()
db.append(["dr1p","soundcloud","fenix flexin - 10 toes ( dr1ph0p m1x )","06660","https://soundcloud.com/vanta_sec/fenix-flexin-10-toes-dr1ph0p-m1x"])
db.reverse()
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
pass
#############################################################################################
####################################################################### database: 2/5 - bbs_nicks
elif database_name==self.database_names[2]:
2022-07-24 13:09:17 +00:00
#############################################################################################
try:
2022-07-25 16:30:54 +00:00
db=[]
db.append({'dr1p':{'tally':1,'bandcamp':0,'soundcloud':1,'spotify':0,'youtube':0}})
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
pass
#############################################################################################
########################################################################database: 3/5 - bbs_sites
elif database_name==self.database_names[3]:
#############################################################################################
2022-07-25 17:17:53 +00:00
try:
2022-07-25 16:30:54 +00:00
db=[]
db.append({'soundcloud':1,'youtube':0,'spotify':0,'bandcamp':0})
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
except:
pass
#############################################################################################
########################################################################database: 4/5 - bbs_token
elif database_name==self.database_names[4]:
2022-07-24 13:09:17 +00:00
#############################################################################################
try:
2022-07-25 16:30:54 +00:00
db=[]
db.append({'06660':'https://soundcloud.com/vanta_sec/fenix-flexin-10-toes-dr1ph0p-m1x'})
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
pass
#############################################################################################
##################################################################database: 5/5 - bbs_tokenmirror
elif database_name==self.database_names[5]:
2022-07-24 13:09:17 +00:00
#############################################################################################
try:
2022-07-25 16:30:54 +00:00
db=[]
db.append({'https://soundcloud.com/vanta_sec/fenix-flexin-10-toes-dr1ph0p-m1x':'06660'})
self.bot.db.setlist(database_name,db)
if db: automation_flag=not automation_flag
2022-07-24 13:09:17 +00:00
except:
2022-07-25 16:30:54 +00:00
pass
#############################################################################################
2022-07-24 13:09:17 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
msg=f'creating database {index+1}/{len(self.database_names)} - {self.database_names[index]}'
if automation_flag:
status='\t\t+ success'
2022-07-24 13:09:17 +00:00
else:
2022-07-25 16:30:54 +00:00
status='\t\t- failure'
print(f'{status}: {msg}')
2022-07-25 17:17:53 +00:00
#################################################################################################
2022-07-25 16:30:54 +00:00
################################################################################################# EOF
2022-07-25 17:17:53 +00:00
##################################################################################################### EOF