m4pl1mp/plugins/boombox_plugin.py
2022-07-27 00:17:33 -05:00

775 lines
46 KiB
Python
Raw Permalink 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
######################################################################################################### 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 worlds 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