restructure bash + buxfixes

master
Paul Walko 2018-12-23 23:20:59 -05:00
parent 292c6e80b0
commit 2fbc6754e9
2 changed files with 161 additions and 143 deletions

View File

@ -20,7 +20,7 @@ def setup(self):
if not os.path.exists(self.bash_quotes_path): if not os.path.exists(self.bash_quotes_path):
os.makedirs(self.bash_quotes_path) os.makedirs(self.bash_quotes_path)
c = self.bash_conn.cursor() c = self.bash_conn.cursor()
c.execute('''create table if not exists quotes ( c.execute('''create table if not exists quotes (
id integer primary key autoincrement, id integer primary key autoincrement,
@ -42,112 +42,85 @@ def setup(self):
# Start thread to check for new messages # Start thread to check for new messages
Thread(target = insert_into_db_caller, args=(self,)).start() Thread(target = insert_into_db_caller, args=(self,)).start()
def bash(phenny, input): def insert_into_db(phenny, sqlite_data):
"""'.bash' - queries a quote selection to add""" """inserts message to to temp db"""
usage = "Usage: .bash <nick_1> <# msgs to start at> <nick_2> <# msgs to end at> (Specifies a range of messages)"
input_all = input.group(2)
if not input_all:
phenny.say(usage)
return
input_args = input_all.split()
if len(input_args) < 4:
phenny.say(usage)
return
channel = input.sender
nick1 = input_args[0]
nick1_start_str = input_args[1]
nick2 = input_args[2]
nick2_end_str = input_args[3]
# Check Input Type if not bash.conn:
if not nick1_start_str.isdigit() or not nick2_end_str.isdigit(): bash.conn = sqlite3.connect(phenny.bash_db)
phenny.say("Error: 2nd & 4th argument must be integers")
phenny.say(usage)
return
nick1_start = int(nick1_start_str) c = bash.conn.cursor()
nick2_end = int(nick2_end_str)
# Connect to db c.execute('''INSERT INTO quotes
fn = phenny.nick + '-' + phenny.config.host + '.bash.db' (channel, nick, quote, time)
bash_db = os.path.join(os.path.expanduser('~/.phenny'), fn) VALUES(
bash_conn = sqlite3.connect(bash_db) :channel,
c = bash_conn.cursor() :nick,
:quote,
CURRENT_TIMESTAMP
);''', sqlite_data)
# Check input for validity c.execute('''INSERT OR REPLACE INTO stats
c.execute('''SELECT lines FROM stats WHERE (channel=? OR channel='NULL') AND nick=?''', (channel, nick1)) (channel, nick, lines)
VALUES(
:channel,
:nick,
COALESCE((SELECT lines FROM stats WHERE channel=:channel AND nick=:nick) + 1, 1)
);''', sqlite_data)
c.close()
bash.conn.commit()
c = bash.conn.cursor()
c.execute('''SELECT id FROM quotes ORDER BY id DESC LIMIT 1''')
last_id = c.fetchall()[0][0] - 99
c.execute('''SELECT channel, nick FROM quotes WHERE id < ?''', (last_id,))
rows = c.fetchall() rows = c.fetchall()
nick1_total = 0
for row in rows: for row in rows:
nick1_total = nick1_total + row[0] channel = row[0]
nick = row[1]
c.execute('''SELECT lines FROM stats WHERE (channel=? OR channel='NULL') AND nick=?''', (channel, nick2)) c.execute('''SELECT lines FROM stats WHERE channel=? AND nick=?''', (channel, nick))
rows = c.fetchall() lines = 0
nick2_total = 0 lines = c.fetchall()[0][0]
for row in rows:
nick2_total = nick2_total + row[0]
if nick1_total < nick1_start: if lines - 1 == 0:
phenny.say("Error: {} has not done {} actions (EVERYTHING included EXCEPT {} replies)" \ c.execute('''DELETE FROM stats WHERE channel=? AND nick=?''', (channel, nick))
.format(nick1, nick1_start, phenny.nick)) else:
return c.execute('''REPLACE INTO stats
(channel, nick, lines)
if nick2_total < nick2_end: VALUES(
phenny.say("Error: {} has not done {} actions (EVERYTHING included EXCEPT {} replies)" \ ?,
.format(nick2, nick2_end, phenny.nick)) ?,
return (SELECT lines FROM stats WHERE channel=? AND nick=?) - 1
);''', (channel, nick, channel, nick))
# Fetch quote ids c.execute('''DELETE FROM quotes WHERE id < ?''', (last_id,))
c.execute('''SELECT id, channel, nick FROM quotes WHERE (channel=? OR channel='ALL') AND nick=?''', (channel, nick1))
rows = c.fetchall()
nick1_id = -1
for row, i in zip(reversed(rows), range(nick1_start)):
if i == nick1_start - 1:
nick1_id = row[0]
c.execute('''SELECT id, channel, nick FROM quotes WHERE (channel=? OR channel='ALL') AND nick=?''', (channel, nick2)) c.close()
rows = c.fetchall() bash.conn.commit()
nick2_id = -1
for row, i in zip(reversed(rows), range(nick2_end)):
if i == nick2_end - 1:
nick2_id = row[0]
if nick2_id < nick1_id: def insert_into_db_caller(phenny):
phenny.say("Error, try again. 2nd nick number (Newer) must come after 1st nick number") """Checks for a new quote once a second
phenny.say(usage) """
return while True:
global queue
# Fetch quotes within range of ids if len(queue) > 0:
c.execute('''SELECT quote FROM quotes WHERE (channel=? OR channel='ALL') AND id >= ? AND id <= ?''', (channel, nick1_id, nick2_id)) insert_into_db(phenny, queue.pop(0))
final_lines = [] time.sleep(1)
for line in c.fetchall():
final_lines.append(line[0])
final_lines = ''.join(final_lines)
quote_json = {
'body': final_lines,
'tags': ','.join(['bone', nick1, nick2]),
'key': "SUPERSECRETAPIKEY"
}
web.post('https://bash.vtluug.org/quotes', {}, {}, True, json=quote_json)
phenny.say('Check https://bash.vtluug.org/quotes to see your quote!')
def logger(phenny, input): def logger(phenny, input):
"""logs everyting to specific format, except we only keep last 100 lines """logs everyting to specific format, except we only keep last 100 lines
""" """
allowed_actions = ['PRIVMSG', 'JOIN', 'QUIT', 'PART', 'NICK', 'KICK', 'MODE'] allowed_actions = ['PRIVMSG', 'JOIN', 'QUIT', 'PART', 'NICK', 'KICK', 'MODE']
if input.event not in allowed_actions: if input.event not in allowed_actions:
return return
message="" message=''
if input.event == 'PRIVMSG': if input.event == 'PRIVMSG':
channel = input.sender channel = input.sender
nick = input.nick nick = input.nick
@ -176,7 +149,8 @@ def logger(phenny, input):
channel = input.sender channel = input.sender
nick = input.nick nick = input.nick
quote = "<-- {nick} has kicked {nick_kick} [{kick_msg}] from {channel}" \ quote = "<-- {nick} has kicked {nick_kick} [{kick_msg}] from {channel}" \
.format(nick=nick, nick_kick=input.args[1], kick_msg=input.group(1), channel=channel) .format(nick=nick, nick_kick=input.args[1],
kick_msg=input.group(1), channel=channel)
elif input.event == 'NICK': elif input.event == 'NICK':
channel = 'ALL' channel = 'ALL'
nick = input.nick nick = input.nick
@ -206,72 +180,112 @@ def logger(phenny, input):
global queue global queue
queue.append(sqlite_data) queue.append(sqlite_data)
def insert_into_db_caller(phenny): def bash(phenny, input):
while True: """'.bash' - queries a quote selection to add"""
global queue usage = ('Usage: .bash <nick_1> <# msgs to start at> <nick_2>'
if len(queue) > 0: ' <# msgs to end at> (Specifies a range of messages)')
insert_into_db(phenny, queue.pop(0))
time.sleep(1)
def insert_into_db(phenny, sqlite_data): input_all = input.group(2)
"""inserts message to to temp db""" if not input_all:
phenny.say(usage)
return
if not bash.conn: input_args = input_all.split()
bash.conn = sqlite3.connect(phenny.bash_db) if len(input_args) < 4:
phenny.say(usage)
c = bash.conn.cursor() return
c.execute('''insert into quotes channel = input.sender
(channel, nick, quote, time) nick1 = input_args[0]
values( nick1_start_str = input_args[1]
:channel, nick2 = input_args[2]
:nick, nick2_end_str = input_args[3]
:quote,
CURRENT_TIMESTAMP
);''', sqlite_data)
c.execute('''insert or replace into stats # Check Input Type
(channel, nick, lines) if not nick1_start_str.isdigit() or not nick2_end_str.isdigit():
values( phenny.say('Error: 2nd & 4th argument must be integers')
:channel, phenny.say(usage)
:nick, return
coalesce((select lines from stats where channel=:channel and nick=:nick) + 1, 1)
);''', sqlite_data)
nick1_start = int(nick1_start_str)
nick2_end = int(nick2_end_str)
c.close() # Connect to db
bash.conn.commit() fn = phenny.nick + '-' + phenny.config.host + '.bash.db'
bash_db = os.path.join(os.path.expanduser('~/.phenny'), fn)
c = bash.conn.cursor() bash_conn = sqlite3.connect(bash_db)
c = bash_conn.cursor()
c.execute('''select id from quotes order by id desc limit 1''')
last_id = c.fetchall()[0][0] - 99 # Check input for validity
c.execute('''SELECT lines FROM stats
c.execute('''select channel, nick from quotes where id < ?''', (last_id,)) WHERE (channel=? OR channel='NULL')
AND nick=?''', (channel, nick1))
rows = c.fetchall() rows = c.fetchall()
nick1_total = 0
for row in rows: for row in rows:
channel = row[0] nick1_total = nick1_total + row[0]
nick = row[1]
c.execute('''select lines from stats where channel=? and nick=?''', (channel, nick)) c.execute('''SELECT lines FROM stats
lines = 0 WHERE (channel=? OR channel='NULL')
lines = c.fetchall()[0][0] AND nick=?''', (channel, nick2))
rows = c.fetchall()
nick2_total = 0
for row in rows:
nick2_total = nick2_total + row[0]
if lines - 1 == 0: if nick1_total < nick1_start:
c.execute('''delete from stats where channel=? and nick=?''', (channel, nick)) phenny.say("Error: {} has not done {} actions ({} replies not included)" \
else: .format(nick1, nick1_start, phenny.nick))
c.execute('''replace into stats return
(channel, nick, lines)
values(
?,
?,
(select lines from stats where channel=? and nick=?) - 1
);''', (channel, nick, channel, nick))
c.execute('''delete from quotes where id < ?''', (last_id,)) if nick2_total < nick2_end:
phenny.say("Error: {} has not done {} actions ({} replies not included)" \
.format(nick2, nick2_end, phenny.nick))
return
c.close() # Fetch quote ids
bash.conn.commit() c.execute('''SELECT id, channel, nick FROM quotes
WHERE (channel=? OR channel='ALL')
AND nick=?''', (channel, nick1))
rows = c.fetchall()
nick1_id = -1
for row, i in zip(reversed(rows), range(nick1_start)):
if i == nick1_start - 1:
nick1_id = row[0]
c.execute('''SELECT id, channel, nick FROM quotes
WHERE (channel=? OR channel='ALL')
AND nick=?''', (channel, nick2))
rows = c.fetchall()
nick2_id = -1
for row, i in zip(reversed(rows), range(nick2_end)):
if i == nick2_end - 1:
nick2_id = row[0]
if nick2_id < nick1_id:
phenny.say('Error, try again. 2nd message must occur after first message.')
phenny.say(usage)
return
# Fetch quotes within range of ids
c.execute('''SELECT quote FROM quotes
WHERE (channel=? OR channel='ALL')
AND id >= ? AND id <= ?''', (channel, nick1_id, nick2_id))
final_lines = []
for line in c.fetchall():
final_lines.append(line[0])
final_lines = ''.join(final_lines)
quote_json = {
'body': final_lines,
'tags': ','.join([phenny.nick, nick1, nick2]),
'key': phenny.config.bash_api_key
}
web.post('https://bash.vtluug.org/quotes', {}, {}, True, json=quote_json)
phenny.say('Check https://bash.vtluug.org/quotes to see your quote!')
bash.conn = None bash.conn = None
bash.rule = (['bash', 'vtbash', 'quote'], r'(.*)') bash.rule = (['bash', 'vtbash', 'quote'], r'(.*)')

6
phenny
View File

@ -46,10 +46,14 @@ def create_default_config(fn):
# leave the api key blank to not use them and be sure to add the 'linx' module to the ignore list. # leave the api key blank to not use them and be sure to add the 'linx' module to the ignore list.
linx_api_key = "" linx_api_key = ""
# bash-enabled features
# designed to be used with https://github.com/vtluug/pyqdb
bash_api_key = ''
# These are people who will be able to use admin.py's functions... # These are people who will be able to use admin.py's functions...
admins = [owner, 'someoneyoutrust'] admins = [owner, 'someoneyoutrust']
# But admin.py is disabled by default, as follows: # But admin.py is disabled by default, as follows:
exclude = ['admin', 'linx', 'foodforus'] exclude = ['admin', 'linx', 'foodforus', 'bash']
ignore = [''] ignore = ['']