775 lines
46 KiB
Python
775 lines
46 KiB
Python
# -*- 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>...
|
||
"""
|
||
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"
|
||
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
|