Skip to content

Commit

Permalink
Merge pull request TotallyNotRobots#409 from linuxdaemon/gonzobot+db-…
Browse files Browse the repository at this point in the history
…refactor

Clean up DB tables and type use across multiple plugins
  • Loading branch information
linuxdaemon authored Feb 14, 2019
2 parents 9e5ab9c + 0302d3d commit 02950e6
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 51 deletions.
8 changes: 4 additions & 4 deletions plugins/factoids.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@
table = Table(
"factoids",
database.metadata,
Column("word", String(25)),
Column("data", String(500)),
Column("nick", String(25)),
Column("chan", String(65)),
Column("word", String),
Column("data", String),
Column("nick", String),
Column("chan", String),
PrimaryKeyConstraint('word', 'chan')
)

Expand Down
26 changes: 23 additions & 3 deletions plugins/hookup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,21 @@
import random
import time

from sqlalchemy import table, column, String, Float, and_, select

from cloudbot import hook
from cloudbot.util.database import metadata
from cloudbot.util.textgen import TextGenerator

hookups = {}
seen_table = table(
'seen_user',
column('name', String),
column('time', Float),
column('quote', String),
column('chan', String),
column('host', String),
)


@hook.on_start
Expand All @@ -20,11 +31,18 @@ def load_data(bot):
@hook.command(autohelp=False)
def hookup(db, chan):
"""- matches two users from the channel in a sultry scene."""
if seen_table.name not in metadata.tables:
return

times = time.time() - 86400
results = db.execute("select name from seen_user where chan = :chan and time > :time",
{"chan": chan, "time": times}).fetchall()
results = db.execute(select(
[seen_table.c.name],
and_(seen_table.c.chan == chan, seen_table.c.time > times)
)).fetchall()

if not results or len(results) < 2:
return "something went wrong"

# Make sure the list of people is unique
people = list(set(row[0] for row in results))
random.shuffle(people)
Expand All @@ -33,5 +51,7 @@ def hookup(db, chan):
'user1': person1,
'user2': person2,
}
generator = TextGenerator(hookups['templates'], hookups['parts'], variables=variables)
generator = TextGenerator(
hookups['templates'], hookups['parts'], variables=variables
)
return generator.generate_string()
6 changes: 3 additions & 3 deletions plugins/ignore.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
table = Table(
"ignored",
database.metadata,
Column("connection", String(25)),
Column("channel", String(25)),
Column("mask", String(250)),
Column("connection", String),
Column("channel", String),
Column("mask", String),
Column("status", Boolean, default=True),
UniqueConstraint("connection", "channel", "mask", "status"),
PrimaryKeyConstraint("connection", "channel", "mask")
Expand Down
4 changes: 2 additions & 2 deletions plugins/lastfm.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
table = Table(
"lastfm",
database.metadata,
Column('nick', String(25)),
Column('acc', String(25)),
Column('nick', String),
Column('acc', String),
PrimaryKeyConstraint('nick')
)

Expand Down
4 changes: 2 additions & 2 deletions plugins/librefm.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
table = Table(
"librefm",
database.metadata,
Column('nick', String(25)),
Column('acc', String(25)),
Column('nick', String),
Column('acc', String),
PrimaryKeyConstraint('nick')
)

Expand Down
14 changes: 7 additions & 7 deletions plugins/notes.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from datetime import datetime

import sqlalchemy
from sqlalchemy import Table, Column, String, Boolean, Integer, DateTime, PrimaryKeyConstraint
from sqlalchemy import Table, Column, String, Boolean, Integer, DateTime, PrimaryKeyConstraint, not_
from sqlalchemy.sql import select

from cloudbot import hook
Expand All @@ -11,9 +11,9 @@
'notes',
database.metadata,
Column('note_id', Integer),
Column('connection', String(25)),
Column('user', String(25)),
Column('text', String(500)),
Column('connection', String),
Column('user', String),
Column('text', String),
Column('priority', Integer),
Column('deleted', Boolean),
Column('added', DateTime),
Expand All @@ -31,7 +31,7 @@ def read_all_notes(db, server, user, show_deleted=False):
query = select([table.c.note_id, table.c.text, table.c.added]) \
.where(table.c.connection == server) \
.where(table.c.user == user.lower()) \
.where(table.c.deleted == 0) \
.where(not_(table.c.deleted)) \
.order_by(table.c.added)
return db.execute(query).fetchall()

Expand All @@ -40,7 +40,7 @@ def delete_all_notes(db, server, user):
query = table.update() \
.where(table.c.connection == server) \
.where(table.c.user == user.lower()) \
.values(deleted=1)
.values(deleted=True)
db.execute(query)
db.commit()

Expand All @@ -58,7 +58,7 @@ def delete_note(db, server, user, note_id):
.where(table.c.connection == server) \
.where(table.c.user == user.lower()) \
.where(table.c.note_id == note_id) \
.values(deleted=1)
.values(deleted=True)
db.execute(query)
db.commit()

Expand Down
78 changes: 63 additions & 15 deletions plugins/quote.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,71 @@
import re
import time

from sqlalchemy import select, Table, Column, String, PrimaryKeyConstraint
from sqlalchemy import select, Table, Column, String, PrimaryKeyConstraint, Boolean, not_
from sqlalchemy.exc import IntegrityError
from sqlalchemy.types import REAL

from cloudbot import hook
from cloudbot.util import database

qtable = Table(
'quote',
'new_quote',
database.metadata,
Column('chan', String(25)),
Column('nick', String(25)),
Column('add_nick', String(25)),
Column('msg', String(500)),
Column('chan', String),
Column('nick', String),
Column('add_nick', String),
Column('msg', String),
Column('time', REAL),
Column('deleted', String(5), default=0),
PrimaryKeyConstraint('chan', 'nick', 'time')
Column('deleted', Boolean, default=False),
PrimaryKeyConstraint('chan', 'nick', 'msg')
)


@hook.on_start()
def migrate_table(db, logger):
old_table = Table(
'quote',
database.metadata,
Column('chan', String(25)),
Column('nick', String(25)),
Column('add_nick', String(25)),
Column('msg', String(500)),
Column('time', REAL),
Column('deleted', String(5), default=0),
PrimaryKeyConstraint('chan', 'nick', 'time')
)

if not old_table.exists():
database.metadata.remove(old_table)
return

old_quotes = db.execute(old_table.select()).fetchall()

if not old_quotes:
return

logger.info("Migrating quotes table")
qtable.drop(checkfirst=True)
qtable.create(checkfirst=True)

db.execute(qtable.insert().values([
{
'chan': row['chan'],
'nick': row['nick'],
'add_nick': row['add_nick'],
'msg': row['msg'],
'time': row['time'],
'deleted': row['deleted'] in (1, '1', True)
} for row in old_quotes
]))

logger.info("Migrated all quotes")

db.commit()
old_table.drop()
database.metadata.remove(old_table)


def format_quote(q, num, n_quotes):
"""Returns a formatted string of a quote"""
_, nick, msg = q
Expand Down Expand Up @@ -52,7 +97,7 @@ def del_quote(db, nick, msg):
.where(qtable.c.chan == 1) \
.where(qtable.c.nick == nick.lower()) \
.where(qtable.c.msg == msg) \
.values(deleted=1)
.values(deleted=True)
db.execute(query)
db.commit()

Expand All @@ -78,8 +123,9 @@ def get_quote_by_nick(db, nick, num=False):
"""Returns a formatted quote from a nick, random or selected by number"""

count_query = select([qtable]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.nick == nick.lower()) \
.alias("count") \
.count()
count = db.execute(count_query).fetchall()[0][0]

Expand All @@ -89,7 +135,7 @@ def get_quote_by_nick(db, nick, num=False):
return error_message

query = select([qtable.c.time, qtable.c.nick, qtable.c.msg]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.nick == nick.lower()) \
.order_by(qtable.c.time) \
.limit(1) \
Expand All @@ -101,9 +147,10 @@ def get_quote_by_nick(db, nick, num=False):
def get_quote_by_nick_chan(db, chan, nick, num=False):
"""Returns a formatted quote from a nick in a channel, random or selected by number"""
count_query = select([qtable]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.chan == chan) \
.where(qtable.c.nick == nick.lower()) \
.alias("count") \
.count()
count = db.execute(count_query).fetchall()[0][0]

Expand All @@ -113,7 +160,7 @@ def get_quote_by_nick_chan(db, chan, nick, num=False):
return error_message

query = select([qtable.c.time, qtable.c.nick, qtable.c.msg]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.chan == chan) \
.where(qtable.c.nick == nick.lower()) \
.order_by(qtable.c.time) \
Expand All @@ -126,8 +173,9 @@ def get_quote_by_nick_chan(db, chan, nick, num=False):
def get_quote_by_chan(db, chan, num=False):
"""Returns a formatted quote from a channel, random or selected by number"""
count_query = select([qtable]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.chan == chan) \
.alias("count") \
.count()
count = db.execute(count_query).fetchall()[0][0]

Expand All @@ -137,7 +185,7 @@ def get_quote_by_chan(db, chan, num=False):
return error_message

query = select([qtable.c.time, qtable.c.nick, qtable.c.msg]) \
.where(qtable.c.deleted != 1) \
.where(not_(qtable.c.deleted)) \
.where(qtable.c.chan == chan) \
.order_by(qtable.c.time) \
.limit(1) \
Expand Down
8 changes: 4 additions & 4 deletions plugins/remind.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
table = Table(
'reminders',
database.metadata,
Column('network', String(50)),
Column('added_user', String(30)),
Column('network', String),
Column('added_user', String),
Column('added_time', DateTime),
Column('added_chan', String(50)),
Column('message', String(512)),
Column('added_chan', String),
Column('message', String),
Column('remind_time', DateTime),
PrimaryKeyConstraint('network', 'added_user', 'added_time')
)
Expand Down
22 changes: 11 additions & 11 deletions plugins/tell.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from datetime import datetime
from fnmatch import fnmatch

from sqlalchemy import Table, Column, String, Boolean, DateTime, PrimaryKeyConstraint, and_
from sqlalchemy import Table, Column, String, Boolean, DateTime, PrimaryKeyConstraint, and_, not_
from sqlalchemy.sql import select

from cloudbot import hook
Expand All @@ -13,10 +13,10 @@
table = Table(
'tells',
database.metadata,
Column('connection', String(25)),
Column('sender', String(25)),
Column('target', String(25)),
Column('message', String(500)),
Column('connection', String),
Column('sender', String),
Column('target', String),
Column('message', String),
Column('is_read', Boolean),
Column('time_sent', DateTime),
Column('time_read', DateTime)
Expand Down Expand Up @@ -53,7 +53,7 @@ def load_cache(db):
:type db: sqlalchemy.orm.Session
"""
new_cache = []
for row in db.execute(table.select().where(table.c.is_read == 0)):
for row in db.execute(table.select().where(not_(table.c.is_read))):
conn = row["connection"]
target = row["target"]
new_cache.append((conn, target))
Expand Down Expand Up @@ -220,7 +220,7 @@ def get_unread(db, server, target):
query = select([table.c.sender, table.c.message, table.c.time_sent]) \
.where(table.c.connection == server.lower()) \
.where(table.c.target == target.lower()) \
.where(table.c.is_read == 0) \
.where(not_(table.c.is_read)) \
.order_by(table.c.time_sent)
return db.execute(query).fetchall()

Expand All @@ -229,7 +229,7 @@ def count_unread(db, server, target):
query = select([table]) \
.where(table.c.connection == server.lower()) \
.where(table.c.target == target.lower()) \
.where(table.c.is_read == 0) \
.where(not_(table.c.is_read)) \
.alias("count") \
.count()
return db.execute(query).fetchone()[0]
Expand All @@ -239,8 +239,8 @@ def read_all_tells(db, server, target):
query = table.update() \
.where(table.c.connection == server.lower()) \
.where(table.c.target == target.lower()) \
.where(table.c.is_read == 0) \
.values(is_read=1)
.where(not_(table.c.is_read)) \
.values(is_read=True)
db.execute(query)
db.commit()
load_cache(db)
Expand All @@ -251,7 +251,7 @@ def read_tell(db, server, target, message):
.where(table.c.connection == server.lower()) \
.where(table.c.target == target.lower()) \
.where(table.c.message == message) \
.values(is_read=1)
.values(is_read=True)
db.execute(query)
db.commit()
load_cache(db)
Expand Down

0 comments on commit 02950e6

Please sign in to comment.