# PyBot v1.0 - Based on code by chevloschelios # (http://ubuntuforums.org/showthread.php?t=1493702) # Modified by Ikewise with help from Adrian Malacoda import socket server = '127.0.0.1' port = 6667 channel = '#lobby' botnick = 'PyBot' def say(sendtarget, sendmsg): irc.send(bytes('PRIVMSG '+ sendtarget +' :'+ sendmsg +'\r\n', 'UTF-8')) # Differentiate between channel and private messages if sendtarget[0] != '#': print('DIRECT (' + sendtarget + '): <' + botnick + '> ' + sendmsg) else: print(sendtarget + ': <' + botnick + '> ' + sendmsg) def join(chan): irc.send(bytes('JOIN :'+ chan +'\r\n', 'UTF-8')) print('* Now talking in ' + chan) say(channel, 'Hello '+ chan +'!') def part(chan): irc.send(bytes('PART '+ chan +'\r\n', 'UTF-8')) def logoff(sendmsg): irc.send(bytes('QUIT :'+ sendmsg +'\r\n', 'UTF-8')) # Program begins print('Connecting to ' + server + ':' + str(port) + '...') print() irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) irc.connect((server, port)) irc.send(bytes('NICK '+ botnick +'\n', 'UTF-8')) irc.send(bytes('USER '+ botnick +' '+ botnick +' '+ botnick +' :Python IRC bot\r\n', 'UTF-8')) join(channel) while True: data = str(irc.recv(4096)) data = data.lstrip("b':") data = data.lstrip('b":') data = data[0:len(data)-5] if data == '': # Detect connection loss break if data.find('PING') != -1: # Respond to server pings irc.send(bytes('PONG ' + data.split() [ 1 ] + '\r\n', 'UTF-8')) # break it down, q-dog sender = data[0:data.find(' ')] data = data[data.find(' ') + 1:] datatype = data[0:data.find(' ')] data = data[data.find(' ') + 1:] if datatype == 'QUIT' or 'NICK': target = '' data = data.lstrip(":") elif datatype == 'JOIN' or 'PART': target = data data = '' elif datatype == 'KICK': target = data[0:data.find(' ')] data = data[data.find(' ') + 1:] kicktarget = data[0:data.find(' ')] data = data[data.find(' ') + 1:] else: target = data[0:data.find(' ')] data = data[data.find(' ') + 1:] if sender.find('!') != -1 and datatype != 'QUIT' or 'JOIN' or 'PART' or 'INVITE': sender = sender[0:sender.find('!')] # Strip names of extra data target = target.lstrip(':') data = data.lstrip(':') msg = data.lower() # Case-sensitivity is an asshole # Print formatted data to console if datatype == 'QUIT': print('* Quits: ' + sender[0:sender.find('!')] + ' (' + sender[sender.find('!') + 1:] + ') (' + data + ')') if datatype == 'JOIN': print(target + ': * Joins: ' + sender[0:sender.find('!')] + ' (' + sender[sender.find('!') + 1:] + ')) if datatype == 'PART': print(target + ': * Parts: ' + sender[0:sender.find('!')] + ' (' + sender[sender.find('!') + 1:] + ')) if datatype == 'KICK': print(target + ': * ' + kicktarget + ' was kicked by ' + sender + ' (' + data + ')') if kicktarget == botnick: # Auto-Rejoin when kicked join(target) if datatype == 'MODE': print(target + ': * ' + sender + ' sets mode: ' + data) if datatype == 'TOPIC': print(target + ': * ' + sender + ' changes topic to \'' + data + '\'') if datatype == 'INVITE': print('* ' + sender[0:sender.find('!')] + ' (' + sender[sender.find('!') + 1:] + ' invites you to join ' + data + '\'') if datatype == 'NICK': print('* ' + sender + ' is now known as ' + data) if datatype == 'NOTICE': if target[0] != '#': target = sender print('NOTICE: -' + sender + '- ' + data) else: print(target + ': NOTICE -' + sender + '- ' + data) if datatype == 'PRIVMSG': # If not a channel if target[0] != '#': target = sender if data.find('\\x01') == 0: data = data.strip('\\x01') if data.find('ACTION') == 4: print('DIRECT (' + sender + '): * ' + sender + ' ' + data) else: print('CTCP: -> [' + sender + '] ' + data) else: print('DIRECT (' + sender + '): <' + sender + '> ' + data) # If a channel else: if data.find('\\x01') == 0: data = data.strip('\\x01') if data.find('ACTION') == 4: print(target + ': * ' + sender + ' ' + data) else: print(target + ': CTCP -> [' + sender + ':' + target + ' ' + data + '] ') else: print(target + ': <' + sender + '> ' + data) if datatype == 'PRIVMSG': # PyBot main commands begin here # Use "== 0:" for line start, "!= -1:" for anywhere if msg.find('!quit') == 0: logoff('Shutdown command from ' + sender) if msg.find('chk') == 0: say(target, sender + ': ack') if msg.find('hi '+ botnick.lower()) == 0: say(target, 'Hello, ' + sender + '!') if msg.find('hello '+ botnick.lower()) == 0: say(target, 'Greetings, ' + sender + '!') if msg.find('slaps '+ botnick.lower()) != -1: say(target, 'This is the Trout Protection Agency. Please put the Trout Down and walk away with your hands in the air.') # End of program print() print('Connection terminated.')