# -*- coding: utf-8 -*- ##################################################################################################### SOF import irc3 from irc3.plugins.command import command from urllib.parse import urlparse 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' """ ######################################################################################################### class BOOMBOX_COLORS(): ##################################################################################################### def __init__(self,bot): self.bot=bot self.c=[] ##################################################################################################### 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' ##################################################################################################### 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 ##################################################################################################### def tailor(self,s,n): if len(s)<=n: result=s+"."*(n-len(s)) return result else: return s[0:n] ######################################################################################################### class BOOMBOX_STATS: ##################################################################################################### def __init__(self,bot): self.bot=bot self.b1,self.b2,self.b3,self.b4=self.bot.bbc.palette()[0:4] self.b5,self.b6,self.b7,self.b8=self.bot.bbc.palette()[0:4] return ##################################################################################################### def push(self,nick,title,url): nick=self.no_unicode(nick) title=self.no_unicode(title) bbs_last=self.bot.db.getlist("bbs_last") bbs_last=bbs_last[-1:]+bbs_last[:-1] bbs_last[0]=[self.bot.bbc.tailor(nick,10),'╏',self.bot.bbc.tailor(title,65),'╏',url] self.bot.db.setlist("bbs_last",bbs_last) ##################################################################################################### def dbiterate(self,db,s): buffer=self.bot.db.getlist(db) for _ in buffer: try: result=_[s] if result: return result except: pass ##################################################################################################### def token(self,url): bbs_token=self.bot.db.getlist("bbs_token") bbs_tokenmirror=self.bot.db.getlist("bbs_tokenmirror") 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}' ##################################################################################################### def no_unicode(self,s): if len(s) < 1: return s s=s.encode('ascii','ignore').decode() s=s.strip().replace(' ',' ') return s ##################################################################################################### def check(self,nick,site,data): ################################################################################################# bbs_nicks=self.bot.db.getlist("bbs_nicks") bbs_sites=self.bot.db.getlist("bbs_sites") bbs_data=self.bot.db.getlist("bbs_data") bbs_token=self.bot.db.getlist("bbs_token") bbs_tokenmirror=self.bot.db.getlist("bbs_tokenmirror") ################################################################################################# 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]+=1 except: bbs_nicks[0].update({nick:1}) bbs_sites[0][site]+=1 bbs_data[i]=_data self.bot.db.setlist("bbs_nicks",bbs_nicks) self.bot.db.setlist("bbs_sites",bbs_sites) self.bot.db.setlist("bbs_data",bbs_data) return ######################################################################################### try: bbs_nicks[0][nick]+=1 except: bbs_nicks[0].update({nick:1}) ######################################################################################### self.bot.db.setlist("bbs_nicks",bbs_nicks) bbs_sites[0][site]+=1 self.bot.db.setlist("bbs_sites",bbs_sites) bbs_data.append(data) self.bot.db.setlist("bbs_data",bbs_data) URL=data['url']; TOKEN=data['token'] bbs_token.append({TOKEN:URL}) self.bot.db.setlist("bbs_token",bbs_token) bbs_tokenmirror.append({URL:TOKEN}) self.bot.db.setlist("bbs_tokenmirror",bbs_tokenmirror) except: self.bot.db.setlist("bbs_nicks",[{nick: 1}]) self.bot.db.setlist("bbs_sites",[{'soundcloud':0,'youtube':0,'spotify':0,'bandcamp':0}]) bbs_sites=self.bot.db.getlist("bbs_sites") bbs_sites[0][site]+=1 self.bot.db.setlist("bbs_sites",bbs_sites) self.bot.db.setlist("bbs_data",[data]) URL=data['url']; TOKEN=data['token'] bbs_token.append({TOKEN:URL}) self.bot.db.setlist("bbs_token",bbs_token) bbs_tokenmirror.append({URL:TOKEN}) self.bot.db.setlist("bbs_tokenmirror",bbs_tokenmirror) ##################################################################################################### def enter(self,nick,url,title): ################################################################################################# token=self.token(url) bbs_token=self.bot.db.getlist("bbs_token") nick=self.no_unicode(nick) title=self.no_unicode(title) ################################################################################################# data={'nicks':{nick:1},'title':title,'url':url,'token':token,'hits':1} ################################################################################################# if not url.find('soundcloud.com')==-1: title=title[:title.rfind('by')].replace('Stream','').strip() if not title=='SoundCloud - Hear the world’s sound': data['title']=title.split('music |')[0].rstrip() site='soundcloud' data=self.check(nick,site,data) url=f"?bb {token}" self.push(nick.lower(),title.lower(),url) ################################################################################################# if not url.find('youtube.com')==-1 or not url.find('youtu.be')==-1: id=url[-11:] result=self.bot.videos_list_by_id(id=id) if result: site='youtube' data=self.check(nick,site,data) url=f"?bb {token}" self.push(nick.lower(),title.lower(),url) ################################################################################################# if not url.find('spotify.com')==-1: offset=url.rfind('/')+1 try: track=title.split('|')[0].split('- song by')[0].strip() artist=title.split('|')[0].split('- song by')[1].strip() except: track=title.split('|')[0].split('- Album by')[0].strip() artist=title.split('|')[0].split('- Album by')[1].strip() title=f'{artist} - {track}' data['title']=title site='spotify' data=self.check(nick,site,data) url=f"?bb {token}" self.push(nick.lower(),title.lower(),url) ################################################################################################# if not url.find('bandcamp.com')==-1: offset=url.rfind('/')+1 try: track=title.split('|')[0].lower().strip() artist=title.split('|')[1].lower().strip() except: pass title=f'{artist} - {track}' data['title']=title site='bandcamp' data=self.check(nick,site,data) url=f"?bb {token}" self.push(nick.lower(),title.lower(),url) ##################################################################################################### @irc3.extend def diagnostics(self,mode,*args): ##################################################################################################### __doc__='''DETERMINED NO DATABASES''' ################################################################################################# if mode==1: ############################################################################################# __doc__='''CREATING DATABASE''' bbs_token=self.bot.db.getlist("bbs_token") try: test=len(bbs_token[0]) except: bbs_token={'00000':'https://ansibomb.com'} self.bot.db.setlist("bbs_token",[bbs_token]) bbs_tokenmirror={'https://ansibomb.com':'00000'} self.bot.db.setlist("bbs_tokenmirror",[bbs_tokenmirror]) ############################################################################################# __doc__='''CREATING DATABASE''' bbs_nicks=self.bot.db.getlist("bbs_nicks") try: test=len(bbs_nicks[0]) except: bbs_nicks=[] _bbs_nicks={'none':0} bbs_nicks.append(_bbs_nicks) self.bot.db.setlist("bbs_nicks",bbs_nicks) ############################################################################################# __doc__='''CREATING DATABASE''' bbs_last=self.bot.db.getlist("bbs_last") try: test=len(bbs_last[0]) except: bbs_last=[] for _ in range(10): bbs_last.append('') self.bot.db.setlist("bbs_last",bbs_last) ############################################################################################# __doc__='''CREATING DATABASE''' bbs_data=self.bot.db.getlist('bbs_data') try: test=len(bbs_data[0]) except: data={'nicks':{"none":0},'title':"none",'url':'https://ansibomb.com','token':'13666','hits':0} bbs_data=self.bot.db.setlist('bbs_data',[data]) ############################################################################################# __doc__='''CREATING DATABASE''' bbs_sites=self.bot.db.getlist('bbs_sites') try: test=len(bbs_sites[0]) except: data={'nicks':{"databases initialized":0},'title':"no music data yet",'url':'https://ansibomb.com','hits':0} bbs_sites=self.bot.db.setlist("bbs_sites",[{'soundcloud':0,'youtube':0,'spotify':0,'bandcamp':0}]) ######################################################################################################### < HERE < HERE < HERE < HERE < # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< the stats portion of boombox is above >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> # < HERE < HERE < HERE < HERE < ######################################################################################################### < HERE < HERE < HERE < HERE < # <<<<<<<<<<<<<<<<<<<<<<<<<< the operational portion of boombox is below >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> # < HERE < HERE < HERE < HERE < ######################################################################################################### < HERE < HERE < HERE < HERE < @irc3.plugin class Plugin: ##################################################################################################### def __init__(self, bot): ################################################################################################# self.bot=bot self.bot.bbc=BOOMBOX_COLORS(self.bot) self.bot.bbs=BOOMBOX_STATS(self.bot) self.bot.bbs.bot=self.bot self.bot.bbs.kungfu=False bbs_token=self.bot.db.getlist("bbs_token") try: test=len(bbs_token[0]) except: self.bot.bbs.diagnostics(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.bbc.palette() self.bot.bbc.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{c[1]}->" if url: 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)) ##################################################################################################### @command(permission='view') def boombox(self, mask, target, args): """boombox - usage: ?boombox top, ?boombox last, ?boombox user, ?boombox site, ?boombox all %%boombox ... """ command=' '.join(args['']).lower() ########################################################################### KUNGFU KUNGFU KUNGFU if command=='kungfu': self.bot.bbs.kungfu=not self.bot.bbs.kungfu self.bot.privmsg(target,self.bot.emo(f"kungfu: {self.bot.bbs.kungfu}")) ########################################################################### commands=['top','last','user','site','all'] ########################################################################### if not command in commands: msg="boombox - usage: ?boombox top, ?boombox last, ?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') ########################################################################### try: if bbs_data: ######################################################################################### c1,c2,c3,c4,c5,c6,c7,c8=self.bot.bbc.c ######################################################################################### if command=='all': for _ in MOTD.splitlines(): if _: self.bot.privmsg(target,f'{self.bot.bbc.palette()[0]}{_}') ######################################################################################### if command=='top' or command=='all': msg=f'{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸ {c2}◅ {c1}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:10] for i in range(len(bbs_data)): base=bbs_data[nl[0:10][i][0]] title=base['title'] url=base['url'] token=self.bot.bbs.dbiterate('bbs_tokenmirror',url) 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'{c2}{str(i+1).zfill(2)}{c1} ◊ {c4}{self.bot.bbc.tailor(title.lower(),50)}{c1} {self.bot.bbs.b2}{c1}╏\x0F{self.bot.bbs.b4} ?bb {token}{c2}{self.bot.bbs.b2} {c1} ╏{c3}{hits}\x0F {self.bot.bbs.b4}plays total{c1} ╏ {c3}{nick_hits}\x0F {self.bot.bbs.b4}mostly by {c3}{nick}' self.bot.privmsg(target,msg) ######################################################################################### if command=='last' or command=='all': msg=f'{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸ {c2}◅ {c1}LAST SONGS {c2}▻' self.bot.privmsg(target,msg) try: count=0 for i,last_url in enumerate(bbs_last): if len(last_url)>0: count+=1 msg=f'{c2}{str(i+1).zfill(2)} {c1}◊ {c3}{last_url[0]} {c1}{last_url[1]} {c4}{last_url[2]} {c1}{last_url[3]} {self.bot.bbs.b4}{last_url[4]}' self.bot.privmsg(target, msg) if count==0: msg=f'{c2}{str("01")}{c1} ◊ {c3}{str("https://ansibomb.com")}' self.bot.privmsg(target, msg) except Exception as e: msg=f'boombox/error: error in last 10 songs data parsing: {e}' self.bot.privmsg(target,msg) ######################################################################################### if command=='user' or command=='all': msg=f'{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸ {c2}◅ {c1}TOP USERS {c2}▻' self.bot.privmsg(target,msg) bbs_nicks=self.bot.db.getlist("bbs_nicks") nick_hits=[] try: for i, data in enumerate(bbs_nicks[0].values()): nick_hits.append(data) lot_nicks=[(k,v) for k, v in zip(range(len(nick_hits)),nick_hits)] buf_nicks=[] while len(lot_nicks)>0: buf_nicks.append(max(lot_nicks,key=lambda x: x[1])) lot_nicks.remove(buf_nicks[-1]) for i, index in enumerate(buf_nicks): nick=list(bbs_nicks[0])[index[0]] hits=bbs_nicks[0][nick] nick_top_hits=[] for data in bbs_data: try: nick_top_hits.append(data['nicks'][nick]) except: nick_top_hits.append(0) lot_nicks=[(k,v) for k, v in zip(range(len(nick_top_hits)),nick_top_hits)] _buf_nicks=[] while len(lot_nicks)> 0: _buf_nicks.append(max(lot_nicks,key=lambda x: x[1])) lot_nicks.remove(_buf_nicks[-1]) song_hits=_buf_nicks[0][1] index=_buf_nicks[0][0] title=bbs_data[index]['title'] url=bbs_data[index]['url'] token=self.bot.bbs.dbiterate('bbs_tokenmirror',url) msg=f'{c2}{str(i+1).zfill(2)}{c1} ◊ {c3}{self.bot.bbc.tailor(nick.lower(),10)}{c1} ╏ {c4}{self.bot.bbc.tailor(title.lower(),49)}{c1} {c1}╏ {c3}{hits}\x0F {self.bot.bbs.b4}total plays{c1} ╏\x0F{self.bot.bbs.b4} ?bb {token}{c1} {c1}╏\x0F {self.bot.bbs.b4}played {c3}{song_hits}\x0F {self.bot.bbs.b4}times' self.bot.privmsg(target,msg) except TypeError: msg=f'{c2}{str("01")}{c1} ◊ {c3}{str("blank")}{c1} ╏ {c4}{str("need music data")} {c1}╏ {c4}{str("0")}\x0F {c3}total plays {self.bot.bbs.b2}╏ \x0F{self.bot.bbs.b4}?bb 13666{c1} {c1}╏\x0F {self.bot.bbs.b4}played {c3}{str("0")}\x0F {self.bot.bbs.b4}times' self.bot.privmsg(target,msg) ######################################################################################### if command=='site' or command=='all': bbs_sites=self.bot.db.getlist("bbs_sites") msg=f'{c2}◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸◹◸ {c2}◅ {c1}TOP SITES {c2}▻' self.bot.privmsg(target,msg) lot=[(k,v) for k, v in bbs_sites[0].items()] nl=[] while len(lot)>0: nl.append(max(lot,key=lambda x: x[1])) lot.remove(nl[-1]) nl[0:4] bandcamp=[] spotify=[] youtube=[] soundcloud=[] for i,data in enumerate(bbs_data): print(i) if not data['url'].find('soundcloud')==-1: soundcloud.append(bbs_data[i]['hits']) bandcamp.append(0) youtube.append(0) spotify.append(0) print(f"\tsoundcloud {bbs_data[i]['hits']} - {bbs_data[i]['title']}") elif not data['url'].find('youtu.be')==-1: youtube.append(bbs_data[i]['hits']) soundcloud.append(0) bandcamp.append(0) spotify.append(0) print(f"\tyoutube {bbs_data[i]['hits']} - {bbs_data[i]['title']}") elif not data['url'].find('spotify')==-1: spotify.append(bbs_data[i]['hits']) soundcloud.append(0) youtube.append(0) bandcamp.append(0) print(f"\tspotify {bbs_data[i]['hits']} - {bbs_data[i]['title']}") elif not data['url'].find('bandcamp')==-1: bandcamp.append(bbs_data[i]['hits']) soundcloud.append(0) youtube.append(0) spotify.append(0) print(f"\tbandcamp {bbs_data[i]['hits']} - {bbs_data[i]['title']}") try: if max(bandcamp)==0: raise Exception bandcamp_title=bbs_data[bandcamp.index(max(bandcamp))]['title'] bandcamp_url=bbs_data[bandcamp.index(max(bandcamp))]['url'] bandcamp_hits=bbs_data[bandcamp.index(max(bandcamp))]['hits'] except: bandcamp_title='no data yet' bandcamp_url='no url yet' try: if max(spotify)==0: raise Exception spotify_title=bbs_data[spotify.index(max(spotify))]['title'] spotify_url=bbs_data[spotify.index(max(spotify))]['url'] spotify_hits=bbs_data[spotify.index(max(spotify))]['hits'] except: spotify_title='no data yet' spotify_url='no url yet' try: if max(youtube)==0: raise Exception youtube_title=bbs_data[youtube.index(max(youtube))]['title'] youtube_url=bbs_data[youtube.index(max(youtube))]['url'] youtube_hits=bbs_data[youtube.index(max(youtube))]['hits'] except: youtube_title='no data yet' youtube_url='no url yet' try: if max(soundcloud)==0: raise Exception soundcloud_title=bbs_data[soundcloud.index(max(soundcloud))]['title'] soundcloud_url=bbs_data[soundcloud.index(max(soundcloud))]['url'] soundcloud_hits=bbs_data[soundcloud.index(max(soundcloud))]['hits'] except: soundcloud_title='no data yet' soundcloud_url='no url yet' for i,data in enumerate(nl[0:4]): msg=f'{c2}{str(i+1).zfill(2)}{c1} ◊ {c3}{self.bot.bbc.tailor(data[0],10)}{c1} ╏ ' if data[0]=='bandcamp': token=self.bot.bbs.dbiterate('bbs_tokenmirror',bandcamp_url) msg=msg+f'{c4}{self.bot.bbc.tailor(bandcamp_title.lower(),49)} {c1}╏ {c3}{data[1]} {self.bot.bbs.b4}total plays{c1} ╏ {self.bot.bbs.b4}?bb {token}' if not data[1]==0: msg=msg+f'{c1} ╏ {self.bot.bbs.b4}top {c3}{spotify_hits} {self.bot.bbs.b4}plays' elif data[0]=='spotify': token=self.bot.bbs.dbiterate('bbs_tokenmirror',spotify_url) msg=msg+f'{c4}{self.bot.bbc.tailor(spotify_title.lower(),49)} {c1}╏ {c3}{data[1]} {self.bot.bbs.b4}total plays{c1} ╏ {self.bot.bbs.b4}?bb {token}' if not data[1]==0: msg=msg+f'{c1} ╏ {self.bot.bbs.b4}top {c3}{spotify_hits} {self.bot.bbs.b4}plays' elif data[0]=='youtube': token=self.bot.bbs.dbiterate('bbs_tokenmirror',youtube_url) msg=msg+f'{c4}{self.bot.bbc.tailor(youtube_title.lower(),49)} {c1}╏ {c3}{data[1]} {self.bot.bbs.b4}total plays{c1} ╏ {self.bot.bbs.b4}?bb {token}' if not data[1]==0: msg=msg+f'{c1} ╏ {self.bot.bbs.b4}top {c3}{youtube_hits} {self.bot.bbs.b4}plays' elif data[0]=='soundcloud': token=self.bot.bbs.dbiterate('bbs_tokenmirror',soundcloud_url) msg=msg+f'{c4}{self.bot.bbc.tailor(soundcloud_title.lower(),49)} {c1}╏ {c3}{data[1]} {self.bot.bbs.b4}total plays{c1} ╏ {self.bot.bbs.b4}?bb {token}' if not data[1]==0: msg=msg+f'{c1} ╏ {self.bot.bbs.b4}top {c3}{soundcloud_hits} {self.bot.bbs.b4}plays' self.bot.privmsg(target,msg) except: msg="no music data for boombox yet" self.bot.privmsg(target,msg) ##################################################################################################### EOF