2021-06-21 16:04:10 -05:00
import asyncio
2021-06-22 17:40:48 -05:00
import os
import random
import time
2021-06-21 16:04:10 -05:00
from irctokens import build , Line
from ircrobots import Bot as BaseBot
from ircrobots import Server as BaseServer
from ircrobots import ConnectionParams
from botany import IRCBotany as Botany
2021-06-22 23:04:09 -05:00
from admin import Admin
2021-06-21 16:04:10 -05:00
from secrets import PASSWORD
channels = [
2021-06-22 22:57:08 -05:00
" #bots " ,
# "#club",
2021-06-22 17:40:48 -05:00
" ### " ,
2021-06-21 16:04:10 -05:00
]
2021-06-22 23:37:40 -05:00
helpmessage = " hey, i ' m botanybot. i water plants on ~club. my prefix is % a nd i was made by randomuser. check out https://ttm.sh/Fs4.txt for more information. "
2021-06-22 17:40:48 -05:00
def userchooser ( user ) :
return random . choice ( [ i for i in os . listdir ( r " /home " ) if i [ 0 ] == user [ 0 ] ] )
2021-06-21 16:04:10 -05:00
2021-06-22 23:33:12 -05:00
# borrowed from kiedtl/ircbot
async def _aexec ( self , code ) :
# Make an async function with the code and `exec` it
exec ( f " async def __ex(self): " + " " . join ( f " \n { l } " for l in code . split ( " \n " ) ) )
# Get `__ex` from local variables, call it and return the result
return await locals ( ) [ " __ex " ] ( self )
2021-06-21 16:04:10 -05:00
class Server ( BaseServer ) :
2021-06-22 23:04:09 -05:00
admin = Admin ( ' rndusr ' )
2021-06-21 16:04:10 -05:00
async def msg ( self , chan , string , user = None ) :
if user == None : await self . send ( build ( " PRIVMSG " , [ chan , string ] ) )
else : await self . send ( build ( " PRIVMSG " , [ chan , user + " : " + string ] ) )
2021-06-22 17:40:48 -05:00
def isDrunk ( self ) :
if abs ( self . drunkentime - int ( time . time ( ) ) ) > 30 : return True
return False
2021-06-21 16:04:10 -05:00
async def line_read ( self , line : Line ) :
print ( f " { self . name } < { line . format ( ) } " )
if line . command == " 001 " :
await self . send ( build ( " MODE " , [ " botanybot " , " +B " ] ) )
await self . msg ( " nickserv " , " identify " + PASSWORD )
for i in channels :
await self . send ( build ( " JOIN " , [ i ] ) )
2021-06-22 17:40:48 -05:00
self . drunkentime = 0
2021-06-21 16:04:10 -05:00
if line . command == " PRIVMSG " :
user = line . hostmask . nickname
channel = line . params [ 0 ]
if line . params [ - 1 ] == " !rollcall " :
await self . msg ( channel , helpmessage , user )
if line . params [ - 1 ] [ 0 ] == ' % ' :
commands = line . params [ - 1 ] [ 1 : ] . split ( ' ' )
2021-06-22 22:57:08 -05:00
if commands [ 0 ] == " score " :
if len ( commands ) == 2 :
if self . isDrunk ( ) : b = Botany ( commands [ 1 ] )
else :
b = Botany ( userchooser ( commands [ 1 ] ) )
while b . getInfo ( ) == [ ] :
b = Botany ( userchooser ( commands [ 1 ] ) )
i = b . getInfo ( )
await self . msg ( channel , " {} ' s score: {} " . format ( b . user , str ( int ( b . score ( ) ) ) ) , user )
elif commands [ 0 ] == " vodka " :
2021-06-22 17:40:48 -05:00
if self . isDrunk ( ) :
self . drunkentime = int ( time . time ( ) )
await self . msg ( channel , " glug glug glug " , user )
else :
await self . msg ( channel , " vodka? what ' s vodka? *burp* " , user )
2021-06-22 22:57:08 -05:00
elif commands [ 0 ] == " desc " :
2021-06-21 16:04:10 -05:00
if len ( commands ) == 2 :
2021-06-22 17:40:48 -05:00
if self . isDrunk ( ) :
b = Botany ( commands [ 1 ] )
else :
b = Botany ( userchooser ( commands [ 1 ] ) )
2021-06-21 16:04:10 -05:00
await self . msg ( channel , b . plantDescription ( ) , user )
else :
await self . msg ( channel , " specify user " , user )
elif commands [ 0 ] == " water " :
if len ( commands ) == 2 :
2021-06-22 17:40:48 -05:00
if self . isDrunk ( ) :
b = Botany ( commands [ 1 ] )
if b . water ( " {} (via IRC) " . format ( user ) ) :
await self . msg ( channel , b . watered ( ) , user )
else :
await self . msg ( channel , b . cantWater ( ) , user )
2021-06-21 16:04:10 -05:00
else :
2021-06-22 17:40:48 -05:00
b = Botany ( userchooser ( commands [ 1 ] ) )
while not b . water ( " {} (via IRC " . format ( user ) ) :
b = Botany ( userchooser ( commands [ 1 ] ) )
await self . msg ( channel , b . watered ( ) , user )
2021-06-21 16:04:10 -05:00
elif commands [ 0 ] == " help " :
await self . msg ( channel , helpmessage , user )
elif commands [ 0 ] == " join " :
if len ( commands ) == 2 :
if user == self . admin :
await self . send ( build ( " JOIN " , [ commands [ 1 ] ] ) )
await self . msg ( channel , " joined the channel {} " . format ( commands [ 1 ] ) , user )
2021-06-22 23:04:09 -05:00
elif commands [ 0 ] == " addowner " :
2021-06-21 16:04:10 -05:00
if len ( commands ) == 2 :
if user == self . admin :
2021-06-22 23:04:09 -05:00
self . admin . append ( commands [ 1 ] )
await self . msg ( channel , " admin added: {} " . format ( commands [ 1 ] ) , user )
return
else :
await self . msg ( channel , " error: you must be an admin! " , user )
return
else :
await self . msg ( channel , " two arguments required " , user )
return
elif commands [ 0 ] == " delowner " :
if len ( commands ) == 2 :
if user == self . admin :
try : self . admin . remove ( commands [ 1 ] )
except :
await self . msg ( channel , " problem with removing admin " , user )
return
await self . msg ( channel , " admin deleted: {} " . format ( commands [ 1 ] ) , user )
2021-06-21 16:04:10 -05:00
return
else :
await self . msg ( channel , " error: you must be an admin! " , user )
return
else :
await self . msg ( channel , " two arguments required " , user )
return
2021-06-22 23:33:12 -05:00
elif commands [ 0 ] == " amowner " :
if user == self . admin :
await self . msg ( channel , " you ' re an admin " , user )
else :
await self . msg ( channel , " you ' re not an admin " , user )
elif commands [ 0 ] == " ping " : await self . msg ( channel , " pong " , user )
elif commands [ 0 ] == " eval " :
if user == self . admin :
text = ' ' . join ( line . params [ - 1 ] [ 1 : ] . split ( ' ' ) [ 1 : ] )
try :
result = await _aexec ( self , text )
except Exception as e :
await self . msg ( channel , " segfault: {} " . format ( repr ( e ) ) , user )
return
await self . msg ( channel , " {} " . format ( result ) , user )
else :
await self . msg ( channel , " must have admin to execute " , user )
2021-06-21 16:04:10 -05:00
async def line_send ( self , line : Line ) :
print ( f " { self . name } > { line . format ( ) } " )
class Bot ( BaseBot ) :
def create_server ( self , name : str ) :
return Server ( self , name )
async def main ( ) :
bot = Bot ( )
params = ConnectionParams ( " botanybot " , " tilde.chat " , 6697 , True )
await bot . add_server ( " tilde " , params )
await bot . run ( )
if __name__ == " __main__ " :
asyncio . run ( main ( ) )