nxy/bot/plugins/rape.py

88 lines
2.6 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
import random
2017-06-30 12:04:50 +00:00
import irc3
from docopt import Dict as DocOptDict
from irc3.plugins.command import command
from irc3.utils import IrcString
from psycopg2 import Error
from . import DatabasePlugin
2017-06-29 21:57:15 +00:00
@irc3.plugin
class Rape(DatabasePlugin):
requires = ['irc3.plugins.command',
2017-07-07 00:11:20 +00:00
'bot.plugins.storage']
@command
2017-06-29 21:57:15 +00:00
def owe(self, mask: IrcString, target: IrcString, args: DocOptDict):
"""Shows how much a nick owes.
2017-06-29 21:57:15 +00:00
%%owe [<nick>]
"""
2017-06-29 21:57:15 +00:00
nick = args.get('<nick>') or mask.nick
2017-06-29 21:57:15 +00:00
# Fetch result from database
2017-06-30 12:04:50 +00:00
self.cur.execute('''
select
fines
2017-06-30 12:04:50 +00:00
from
users
2017-06-30 12:04:50 +00:00
where
lower(nick) = lower(%s)
2017-06-30 12:04:50 +00:00
''', [nick])
owes = self.cur.fetchone()
2017-06-29 21:57:15 +00:00
# Colorize owe amount and return string
2017-06-30 12:04:50 +00:00
if owes:
fines = '4${fines}'.format(fines=owes['fines'])
2017-06-30 12:04:50 +00:00
else:
fines = '3$0'
2017-06-30 12:04:50 +00:00
# Return total owes
return '{nick} owes: \x03{fines}\x03'.format(nick=nick, fines=fines)
@command
2017-06-29 21:57:15 +00:00
def rape(self, mask: IrcString, target: IrcString, args: DocOptDict):
"""Rapes a nick and eventually charge for it.
%%rape <nick>
"""
nick = args.get('<nick>') or mask.nick
rand = random.randint(0, 3)
2017-06-30 12:04:50 +00:00
if rand not in (0, 1):
self.bot.action(target, 'rapes {nick}'.format(nick=nick))
else:
fine = random.randint(1, 500)
try:
# Insert or add fine to database and return total owe
self.cur.execute('''
insert into
2017-06-30 17:33:26 +00:00
users (nick, fines)
values
(lower(%s), %s)
on conflict (nick) do update set
fines = users.fines + excluded.fines
returning
fines
2017-06-30 18:14:02 +00:00
''', [mask.nick, fine])
self.con.commit()
# Get reason based on rand value
reason = ('raping', 'being too lewd and getting raped')[rand]
2017-06-30 12:04:50 +00:00
# Print fine and total owe
self.bot.action(target,
'fines {nick} \x02${fine}\x02 for {reason}. '
'You owe: \x0304${total}\x03'
2017-06-30 18:14:02 +00:00
.format(nick=mask.nick,
fine=fine,
reason=reason,
total=self.cur.fetchone()['fines']))
except Error:
# Rollback transaction on error
self.con.rollback()