170 lines
5.3 KiB
Python
Executable File
170 lines
5.3 KiB
Python
Executable File
# 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.')
|