2021-12-19 09:05:42 +00:00
#!/usr/bin/python3
2021-12-19 12:30:31 +00:00
import socket , rich , asyncio , time , re , ssl
2021-12-19 09:05:42 +00:00
from config import *
class bot :
def raw ( msg ) :
"""
Sends a raw message using the socket s
"""
s . send ( f " { msg } \n " . encode ( ' utf-8 ' ) )
class logger :
async def log ( msg = None , level = 0 , color = False ) :
if level < = DebugLVL :
if color :
rich . print ( msg ) ;
else :
print ( msg ) ;
async def handle ( line ) :
2021-12-19 12:45:25 +00:00
if ( line [ 0 ] . endswith ( ' .tilde.chat ' ) and ( line [ 1 ] == ' NOTICE ' or line [ 1 ] == ' 001 ' or line [ 1 ] == ' 002 ' or line [ 1 ] == ' 003 ' or line [ 1 ] == ' 004 ' or line [ 1 ] == ' 005 ' or line [ 1 ] == ' 372 ' or line [ 1 ] == ' 251 ' or line [ 1 ] == ' 252 ' or line [ 1 ] == ' 253 ' or line [ 1 ] == ' 254 ' or line [ 1 ] == ' 255 ' or line [ 1 ] == ' 265 ' or line [ 1 ] == ' 266 ' or line [ 1 ] == ' 375 ' or line [ 1 ] == ' 376 ' or line [ 1 ] == ' 396 ' ) ) :
2021-12-19 09:05:42 +00:00
loglevel = 450
2021-12-19 12:45:25 +00:00
elif line [ 0 ] . endswith ( ' .tilde.chat ' ) :
2021-12-19 09:05:42 +00:00
loglevel = 441
elif line [ 0 ] == ' :NickServ!services@services.tilde.chat ' :
2021-12-19 12:45:25 +00:00
if ( line [ 3 ] == ' :This ' or line [ 3 ] == ' :nick, ' or line [ 2 ] == ' :please ' or line [ 3 ] == ' :If ' or line [ 3 ] == ' :Password ' ) :
2021-12-19 09:05:42 +00:00
loglevel = 450
else :
loglevel = 441
elif line [ 0 ] == ' :ChanServ!services@services.tilde.chat ' :
loglevel = 442
elif line [ 0 ] == ' PING ' :
loglevel = 443
else :
loglevel = 440
await bot . logger . log ( f " { ' ' . join ( line ) } " , loglevel ) ;
class get :
def nick ( hostmask ) :
return hostmask [ 1 : ] . split ( ' ! ' ) [ 0 ]
def ident ( hostmask ) :
return hostmask [ 1 : ] . split ( ' ! ' ) [ 1 ] . split ( ' @ ' ) [ 0 ]
def host ( hostmask ) :
return hostmask [ 1 : ] . split ( ' ! ' ) [ 1 ] . split ( ' @ ' ) [ 1 ]
def nslogin ( ) :
bot . raw ( f " PRIVMSG NickServ@services.tilde.chat :IDENTIFY { NICK } { SERVICES_PW } " )
bot . raw ( f " MODE { NICK } +B " )
async def joinchans ( ) :
bot . raw ( f " JOIN { CHANNELS } " )
await bot . logger . log ( f " [bold]Joined channels: [magenta] { CHANNELS } [/magenta] per request of [magenta]-!-[/magenta][/bold] " , color = True )
async def join ( channel , requser = " -!- " , prefixmsg = " Joined " ) :
bot . raw ( f " JOIN : { channel } " )
await bot . logger . log ( f " [bold] { prefixmsg } [magenta] { channel } [/magenta] per request of [magenta] { requser } [/magenta][/bold] " , color = True )
async def part ( channel , msg = " Bye, I ' be worked enough " , requser = " -!- " ) :
bot . raw ( f " PART { channel } : { msg } " )
await bot . logger . log ( f " [bold]Leaved [magenta] { channel } [/magenta] per request of [magenta] { requser } [/magenta][/bold] " , color = True )
async def topic ( channel , topic = " You should set a topic " , requser = " -!- " ) :
bot . raw ( f " TOPIC { channel } : { topic } " )
await bot . logger . log ( f " [bold]Topic of [magenta] { channel } [/magenta] channeged to [blue] { topic } [/blue] per request of [magenta] { requser } [/magenta][/bold] " , color = True )
time . sleep ( 1 )
bot . raw ( f " PRIVMSG { channel } :Changed topic of { channel } " )
async def quit ( msg = " Bye, I ' be worked enough " , requser = " -!- " ) :
bot . raw ( f " QUIT : { msg } " )
await bot . logger . log ( f " [bold]Exiting per request of [magenta] { requser } [/magenta] with message of [magenta] { msg } [/magenta][/bold] " , color = True )
async def setup ( ) :
bot . nslogin ( )
2021-12-22 19:58:52 +00:00
await bot . joinchans ( )
2021-12-19 09:05:42 +00:00
async def ConnectionSetup ( ) :
bot . raw ( f " NICK { NICK } " )
bot . raw ( f " USER { NICK } 0 * : { REALNAME } " )
class Handeler :
async def newmsg ( line ) :
if ( line [ 0 ] == " PING " ) :
bot . raw ( f " PONG { line [ 1 ] } " )
elif ( line [ 0 ] == ' :NickServ!services@services.tilde.chat ' and line [ 1 ] == ' NOTICE ' and line [ 2 ] == ' util ' and line [ 3 ] == ' :If ' ) :
await bot . setup ( )
elif ( line [ 1 ] == " INVITE " and line [ 2 ] == NICK ) :
await bot . join ( line [ 3 ] [ 1 : ] , line [ 0 ] [ 1 : ] , prefixmsg = " Invited to " ) ;
time . sleep ( 1 )
bot . raw ( f " PRIVMSG { line [ 3 ] [ 1 : ] } :Hello, I ' m a bot that joined because { line [ 0 ] [ 1 : ] } invited me. " )
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 2 ] != NICK and line [ 3 ] == " :*.help " ) :
bot . raw ( f " PRIVMSG { line [ 2 ] } :I am a utility bot. " )
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 3 ] == " :*.join " ) :
await bot . join ( line [ 4 ] , line [ 0 ] [ 1 : ] ) ;
time . sleep ( 1 )
bot . raw ( f " PRIVMSG { line [ 4 ] } :Hello, I ' m a bot that joined because { bot . get . nick ( line [ 0 ] ) } told me to. " )
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 3 ] == " :*.part " and ( ( line [ 4 ] != " #lounge " and line [ 4 ] != " #lounge-ops " and line [ 4 ] != " #airstrip " ) or line [ 0 ] [ 1 : ] == ' julian!julian@envs.net ' ) ) :
await bot . part ( line [ 4 ] , f " Leaving per request of { bot . get . nick ( line [ 0 ] ) } " , line [ 0 ] [ 1 : ] ) ;
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 2 ] != NICK and line [ 3 ] == " :*.topic " and ( ( line [ 2 ] != " #lounge " and line [ 2 ] != " #lounge-ops " and line [ 2 ] != " #airstrip " ) or line [ 0 ] [ 1 : ] == ' julian!julian@envs.net ' ) ) :
await bot . topic ( line [ 2 ] , ' ' . join ( line [ 4 : ] ) , line [ 0 ] [ 1 : ] )
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 2 ] != NICK and line [ 3 ] == " :*.echo " ) :
bot . raw ( f " PRIVMSG { line [ 2 ] } : \x03 3[Echo] \x0F \x03 2 { bot . get . nick ( line [ 0 ] ) } \x0F said: \x03 9 { ' ' . join ( line [ 4 : ] ) } " )
elif ( line [ 1 ] == ' PRIVMSG ' and line [ 2 ] != NICK and line [ 3 ] == " :*.psa " and ( ( line [ 4 ] != " #lounge " and line [ 4 ] != " #lounge-ops " and line [ 4 ] != " #airstrip " ) or line [ 0 ] [ 1 : ] == ' julian!julian@envs.net ' ) ) :
if ( line [ 4 ] . startswith ( ' # ' ) ) :
2022-01-07 21:44:57 +00:00
bot . raw ( f " PRIMSG { line [ 4 ] } : \x03 07[Public Service Anouncement] \x0F { ' ' . join ( line [ 5 : ] ) } " )
2021-12-19 09:05:42 +00:00
await bot . logger . log ( f " [bold]PSA by [magenta] { line [ 0 ] [ 1 : ] } [/magenta] -> [magenta] { line [ 4 ] } [/magenta] -> [blue] { ' ' . join ( line [ 5 : ] ) } [/blue][/bold] " , color = True )
else :
bot . raw ( f " PRIVMSG { bot . get . nick ( line [ 0 ] ) } :Sorry, the syntax for PSA is: *.psa <channel> <MESSAGE> " )
readbuffer = " "
2021-12-19 12:30:31 +00:00
2021-12-19 09:05:42 +00:00
s = socket . socket ( )
2021-12-19 12:30:31 +00:00
ctx = ssl . create_default_context ( purpose = ssl . Purpose . CLIENT_AUTH )
if tls == True :
s = ctx . wrap_socket ( s )
2021-12-19 09:05:42 +00:00
s . connect ( ( HOST , PORT ) )
asyncio . run ( bot . ConnectionSetup ( ) )
while True :
readbuffer = readbuffer + s . recv ( 2048 ) . decode ( ' utf-8 ' )
temp = str . split ( readbuffer , " \n " )
readbuffer = temp . pop ( )
for line in temp :
line = str . rstrip ( line )
line = str . split ( line )
asyncio . run ( bot . Handeler . newmsg ( line ) )
asyncio . run ( bot . logger . handle ( line ) )