|
| 1 | +import asyncio |
| 2 | + |
| 3 | +from sqlalchemy import PrimaryKeyConstraint, Column, String, Table, and_ |
| 4 | +from sqlalchemy.exc import IntegrityError |
| 5 | + |
| 6 | +from cloudbot import hook |
| 7 | +from cloudbot.util import database |
| 8 | + |
| 9 | +table = Table( |
| 10 | + 'autojoin', |
| 11 | + database.metadata, |
| 12 | + Column('conn', String), |
| 13 | + Column('chan', String), |
| 14 | + PrimaryKeyConstraint('conn', 'chan') |
| 15 | +) |
| 16 | + |
| 17 | + |
| 18 | +def get_channels(db, conn): |
| 19 | + return db.execute(table.select().where(table.c.conn == conn.name.casefold())).fetchall() |
| 20 | + |
| 21 | + |
| 22 | +@asyncio.coroutine |
| 23 | +@hook.irc_raw('004') |
| 24 | +def do_joins(db, conn, async): |
| 25 | + chans = async(get_channels, db, conn) |
| 26 | + for chan in chans: |
| 27 | + conn.join(chan[1]) |
| 28 | + yield from asyncio.sleep(0.4) |
| 29 | + |
| 30 | + |
| 31 | +@hook.irc_raw('JOIN', singlethread=True) |
| 32 | +def add_chan(db, conn, chan, nick): |
| 33 | + if nick.casefold() == conn.nick.casefold(): |
| 34 | + try: |
| 35 | + db.execute(table.insert().values(conn=conn.name.casefold(), chan=chan.casefold())) |
| 36 | + db.commit() |
| 37 | + except IntegrityError: |
| 38 | + pass |
| 39 | + |
| 40 | + |
| 41 | +@hook.irc_raw('PART', singlethread=True) |
| 42 | +def on_part(db, conn, chan, nick): |
| 43 | + if nick.casefold() == conn.nick.casefold(): |
| 44 | + db.execute(table.delete().where(and_(table.c.conn == conn.name.casefold(), table.c.chan == chan.casefold()))) |
| 45 | + db.commit() |
| 46 | + |
| 47 | + |
| 48 | +@hook.irc_raw('KICK', singlethread=True) |
| 49 | +def on_kick(db, conn, chan, target): |
| 50 | + if target.casefold() == conn.nick.casefold(): |
| 51 | + db.execute(table.delete().where(and_(table.c.conn == conn.name.casefold(), table.c.chan == chan.casefold()))) |
| 52 | + db.commit() |
0 commit comments