# -*- coding: utf-8 -*- ##################################################################################################### SOF ######################################################################################################### SOF import irc3 from irc3.plugins.command import command from urllib.parse import urlparse from datetime import datetime from glob import glob from typing import Type import random import string import os ######################################################################################################### THE ASCII LOGO TO BE USED MOTD=""" _________ _________ _________ ___ ___ _________ _________ ____ ____ | o ) / O \ / O \ | \ / | | o ) / O \ \ \_/ / |_____O___) \_________/ \_________/ |____|____| |_____O___) \_________/ /___/%\___\\ 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BBBBBBB' 'BB' 'BB' """ ######################################################################################################### 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'] 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 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=' '.join(args['']) 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 ... """ c=self.bot.bbs.palette() self.bot.bbs.c=c token=''.join(args['']) 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" self.bot.privmsg(target,self.bot.emo(msg)) ##################################################################################################### BOOMBOX MAIN 2 @command(permission='view',error_format="{cmd} error - usage: ?{cmd} all,top,old,user,site - example: ?{cmd} all".format) def boombox(self, mask, target, args): """boombox %%boombox """ command='all' ########################################################################### commands=['top','old','user','site','all'] ########################################################################### if not command in commands: msg="boombox - usage: ?boombox top, ?boombox old, ?boombox user, ?boombox site, ?boombox all" 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') ########################################################################### 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 ##################################################################################### top_songs=[] for i in range(mode_length): try: base=bbs_data[nl[i][0]] except: pass 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}' top_songs.append(msg) last_song="" for song in top_songs: if song==last_song: break last_song=song self.bot.privmsg(target,song) ######################################################################################### 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=[] for i,_ in enumerate(bbs_data): 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 ################################################################################################################################################################################## ######################################################################################################### BOOMBOX CONFIG ENTRY class BOOMBOX_CONFIG: ##################################################################################################### BOOMBOX CONFIG INIT def __init__(self,bot): 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 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' ##################################################################################################### BOOMBOX CONFIG COLOR SETS 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 ##################################################################################################### BOOMBOX CONFIG TEXT ALIGNMENTS def tailor(self,s,n): if len(s)<=n: result=s+"."*(n-len(s)) return result else: return s[0:n] ##################################################################################################### 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): nick=self.no_unicode(nick) title=self.no_unicode(title) bbs_data=self.dbdo('bbs_data','get') bbs_last=self.dbdo('bbs_last','get') bbs_last=bbs_last[-1:]+bbs_last[:-1] bbs_last[0]=[nick,site,title,token,url] self.dbdo('bbs_last','set',bbs_last) ##################################################################################################### BOOMBOX CONFIG DATABASE OPERATIONS def check(self,nick,site,data): ################################################################################################# 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') ################################################################################################# 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: bbs_nicks[0][nick]['tally']+=1 bbs_nicks[0][nick][site]+=1 except: bbs_nicks[0].update({nick:{'tally':1,'bandcamp':0,'soundcloud':0,'spotify':0,'youtube':0}}) bbs_nicks[0][nick][site]+=1 bbs_sites[0][site]+=1 bbs_data[i]=_data self.dbdo("bbs_nicks",'set',bbs_nicks) self.dbdo("bbs_sites",'set',bbs_sites) self.dbdo("bbs_data",'set',bbs_data) return ######################################################################################### try: bbs_nicks[0][nick]['tally']+=1 bbs_nicks[0][nick][site]+=1 except: bbs_nicks[0].update({nick:{'tally':1,'bandcamp':0,'soundcloud':0,'spotify':0,'youtube':0}}) bbs_nicks[0][nick][site]+=1 ######################################################################################### self.dbdo("bbs_nicks",'set',bbs_nicks) bbs_sites[0][site]+=1 self.dbdo("bbs_sites",'set',bbs_sites) bbs_data.append(data) self.dbdo("bbs_data",'set',bbs_data) URL=data['url']; TOKEN=data['token'] 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) except: 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]) URL=data['url']; TOKEN=data['token'] 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 def enter(self,nick,url,title): ################################################################################################# timestamp=datetime.now().timestamp() token=self.token(url) bbs_token=self.dbdo('bbs_token','get') nick=self.no_unicode(nick) title=self.no_unicode(title).lower() site=self.getsite(url) ################################################################################################# data={'nicks':{nick:1},'title':title.lower(),'url':url,'token':token,'timestamp':timestamp,'site':site,'hits':1} ################################################################################################# if site=='soundcloud': title=title[:title.rfind('by')].replace('Stream','').strip().lower() if not title=='SoundCloud - Hear the world’s sound': data['title']=title.split('music |')[0].rstrip().lower() data=self.check(nick,site,data) self.push(nick.lower(),site,title.lower(),token,url) ################################################################################################# if site=='youtube': id=url[-11:] result=self.bot.videos_list_by_id(id=id) if result: data=self.check(nick,site,data) self.push(nick.lower(),site,title.lower(),token,url) ################################################################################################# if site=='spotify': offset=url.rfind('/')+1 try: track=title.split('|')[0].split('- song by')[0].strip() 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 except: title=title.lower() if track and artist: title=f'{artist} - {track}'.lower() data['title']=title data=self.check(nick,site,data) self.push(nick.lower(),site,title.lower(),token,url) ################################################################################################# if site=='bandcamp': offset=url.rfind('/')+1 try: track=title.split('|')[0].lower().strip() except: pass try: artist=title.split('|')[1].lower().strip() title=f'{artist} - {track}'.lower() except: artist="" title=f'{artist}{track}'.lower() data['title']=title.lower() data=self.check(nick,site,data) 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 @irc3.extend def db_diagnostics(self,database_name,*args): ##################################################################################################### # database_names = ['bbs_data','bbs_last','bbs_nicks','bbs_sites','bbs_token','bbs_tokenmirror'] ################################################################################################# 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 ######################################################################## database: 0/5 - bbs_data if database_name==self.database_names[0]: ############################################################################################# try: 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 except: pass ############################################################################################# ######################################################################## database: 1/5 - bbs_last elif database_name==self.database_names[1]: ############################################################################################# try: db=[] for _ in range(0,self.bot.bbs.ceiling__last_songs): db.append('') 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 except: pass ############################################################################################# ####################################################################### database: 2/5 - bbs_nicks elif database_name==self.database_names[2]: ############################################################################################# try: 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 except: pass ############################################################################################# ########################################################################database: 3/5 - bbs_sites elif database_name==self.database_names[3]: ############################################################################################# try: 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]: ############################################################################################# try: 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 except: pass ############################################################################################# ##################################################################database: 5/5 - bbs_tokenmirror elif database_name==self.database_names[5]: ############################################################################################# try: 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 except: pass ############################################################################################# ################################################################################################# msg=f'creating database {index+1}/{len(self.database_names)} - {self.database_names[index]}' if automation_flag: status='\t\t+ success' else: status='\t\t- failure' print(f'{status}: {msg}') ################################################################################################# ################################################################################################# EOF ##################################################################################################### EOF