m4pl1mp/plugins/boombox_plugin.py
2022-07-24 08:09:17 -05:00

529 lines
30 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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 worlds 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 <token>...
"""
c=self.bot.bbc.palette()
self.bot.bbc.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{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>...
"""
command=' '.join(args['<command>']).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