Difference between revisions of "IRC Bot"

From Unallocated Space
Jump to navigation Jump to search
Line 1: Line 1:
== Version 2.5 ==
+
== Version 2.6 ==
 
Major addition to 2.5 is the ability to add new commands and edit old commands on the fly by editing botfunc.py then echoing "update" into the irc named pipe.
 
Major addition to 2.5 is the ability to add new commands and edit old commands on the fly by editing botfunc.py then echoing "update" into the irc named pipe.
  
Line 8: Line 8:
 
<pre>
 
<pre>
 
#!/usr/bin/env python
 
#!/usr/bin/env python
#stupid hacky irc bot
 
 
#import socket,urllib,sys,threading,time,serial
 
 
import socket,urllib,sys,threading,time,serial,botfunc
 
import socket,urllib,sys,threading,time,serial,botfunc
  
Line 61: Line 58:
 
print "something fucked up"
 
print "something fucked up"
 
time.sleep(30)
 
time.sleep(30)
 
 
</pre>
 
</pre>
  
Line 70: Line 66:
 
<pre>
 
<pre>
 
import socket,urllib,time,serial,os,string
 
import socket,urllib,time,serial,os,string
 +
from xml.dom import minidom
 +
  
 
def send(irc,text):
 
def send(irc,text):
Line 93: Line 91:
  
 
def help(data):
 
def help(data):
data=data.replace('!','')
+
        data=data.replace('!','')
if data=='status':
+
        helps={
return '!status returns the current status of the space. (open/closed)'
+
                'status':'!status returns the current status of the space. (open/closed)',
elif data=='sign':
+
                'sign':'!sign returns or updates the text displayed on the prolite LED sign.',
return '!sign returns or updates the text displayed on the prolite LED sign.'
+
                'tweet':'!tweet returns the latest tweet on the @Unallocated twitter account.',
elif data=='tweet':
+
                'site':'!site returns the latest blog post on http://unallocatedspace.org/',
return '!tweet returns the latest tweet on the @Unallocated twitter account.'
+
                'mc':'!mc facilitates live communication with people playing on the Unallocated Minecraft server. (not active right now)',
elif data=='site':
+
                'rollcall':'!rollcall lists Unallocated Space members that have checked into the space with their UAS member smart cards during the current session (opening to closing)',
return '!site returns the latest blog post on http://unallocatedspace.org/'
+
                'phone':'!phone prints the phone number of the space. 512-943-2827. ooh how meta.',
elif data=='mc':
+
                'weather':'!weather returns the weather conditions outside the space.',
return '!mc is a hidden command that facilitates live communication with people playing on the Unallocated Minecraft server.'
+
                'address':address(None),
 
+
                'request':'!request is used to make improvment or feature requests for UnalloBot.'
elif data=='rollcall':
+
                }
return '!rollcall lists Unallocated Space members that have checked into the space with their UAS member smart cards during the current session (opening to closing)'
+
        return helps[data] if data in helps else 'Available commands are: !'+' !'.join(helps.keys())
elif data=='phone':
 
return '!phone prints the phone number of the space. 512-943-2827. ooh how meta.'
 
 
 
else:
 
return 'Available commands are: !status !rollcall !sign !tweet !site !phone'
 
  
 
def sign(data):
 
def sign(data):
Line 131: Line 124:
 
         return message
 
         return message
  
def mcpipe(data):
+
def weather(data):
 +
usock = urllib.urlopen('http://www.google.com/ig/api?weather=21144')
 +
xmldoc = minidom.parse(usock)
 +
usock.close()
 +
data=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('condition')[0].getAttribute('data').strip() + ' - '
 +
data+="Temp: "+xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('temp_f')[0].getAttribute('data').strip() + ' - '
 +
data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('humidity')[0].getAttribute('data').strip() + ' - '
 +
data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('wind_condition')[0].getAttribute('data').strip()
 +
return data
 +
 
 +
def mcpipe(data):#fix for the securities
 
return 'Not right now.'
 
return 'Not right now.'
 
os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
 
os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
Line 147: Line 150:
 
         else:
 
         else:
 
                 return "The space is closed, Rollcall is not allowed"
 
                 return "The space is closed, Rollcall is not allowed"
 +
 +
def goingson(data): #this may be removed....
 +
os.system("echo '"+status(None)+"' > /uas/irc/irc ")
 +
time.sleep(.1)
 +
os.system("echo '"+rollcall(None)+"' > /uas/irc/irc ")
 +
        time.sleep(.1)
 +
        os.system("echo '"+sign("")+"' > /uas/irc/irc ")
 +
        time.sleep(.1)
 +
        os.system("echo '"+site(None)+"' > /uas/irc/irc ")
 +
        time.sleep(.1)
 +
        os.system("echo '"+tweet(None)+"' > /uas/irc/irc ")
 +
time.sleep(.1)
 +
        os.system("echo '"+weather(None)+"' > /uas/irc/irc ")
 +
return ""
 +
 +
def request(data): #this may be removed....
 +
if data != "":
 +
        f=open('requests.txt','a')
 +
        f.write(data+"\n\n")
 +
        f.close()
 +
        return "Thank you for the feature request."
 +
else:
 +
return "Use this command with text to request new features."
 +
 +
def alert(data):
 +
os.system("python /uas/ippower/alert.py &")
 +
return "Alert Sent."
  
 
def trollcall(data):
 
def trollcall(data):
Line 158: Line 188:
 
return "Call us at 512-943-2827!"
 
return "Call us at 512-943-2827!"
  
 
+
def address(data):
 +
return "512 Shaw CT Suite 105, Severn MD 21144"
  
 
def update(data):
 
def update(data):
Line 164: Line 195:
  
  
commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'mc':mcpipe,'phone':phone,'help':help,    'blog':site,'twit':tweet,'twat':tweet,'brocall':rollcall,'trollcall':trollcall,'bagels':pronto}
+
commands=         {'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'mc':mcpipe,'phone':phone,'address':address,'weather':weather,'goingson':goingson,'request':request,'alert':alert,'help':help,    'space':status,'blog':site,'commands':help,'twit':tweet,'twat':tweet,'brocall':rollcall,'trollcall':trollcall,'bagels':pronto,'allthethings':goingson}
 
 
  
 +
responder_commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'weather':weather,'address':address}
  
 
</pre>
 
</pre>

Revision as of 05:42, 10 October 2011

Version 2.6

Major addition to 2.5 is the ability to add new commands and edit old commands on the fly by editing botfunc.py then echoing "update" into the irc named pipe.

Related: IRC & Minecraft

bot.py

#!/usr/bin/env python
import socket,urllib,sys,threading,time,serial,botfunc

class pipein(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
	threading.Thread.daemon = True

    def run (self):
      global irc
      while True:
         tmp=sys.stdin.readline().strip()
         if tmp !=  "":
	    if tmp == "update":
		reload(botfunc)
	    else:
	    	irc.send('PRIVMSG #unallocatedspace :\001ACTION '+tmp.strip()+'\001\r\n')
            print tmp.strip()
         time.sleep(1)


while True:
	try:
                network = 'irc.mzima.net'
		network = 'irc.prison.net'

	
		port=6667
		irc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		irc.connect((network,port))
	
		print irc.recv(4096)
		irc.send('NICK UnalloBot\r\n')
		irc.send('USER UnalloBot UnalloBot UnalloBot :Unallocated Bot\r\n')
		irc.send('VERSION 2\r\n')
		irc.send('JOIN #unallocatedspace\r\n')

		pipein().start()

		while True:
			data=irc.recv(4096)
			if data.find('PING')!=-1:
				irc.send ('PONG '+data.split()[1]+'\r\n')
			elif data.find('PRIVMSG #unallocatedspace :!')!=-1:
		                data=data[data.find(' :!')+3:].strip()
		                command,u,data=data.partition(" ")
				if command in botfunc.commands:
					botfunc.send(irc,botfunc.commands[command](data.strip()))
	except:
		print "something fucked up"
	time.sleep(30)



botfunc.py

import socket,urllib,time,serial,os,string
from xml.dom import minidom


def send(irc,text):
	if text.strip()!="":
	        irc.send('PRIVMSG #unallocatedspace :\001ACTION '+str(text).strip()+'\001\r\n')

def status(data):
	return open('/tmp/status').read()[1:]

def tweet(data):
        data=urllib.urlopen('https://twitter.com/statuses/user_timeline/165951985.rss?count=1').read()
        data=data.replace('\n',' ')
        data= data[data.find('<item>')+31:]
        return "Last Tweet: "+data[0:data.find('</title>')]

def site(data):
        data=urllib.urlopen('http://www.unallocatedspace.org/uas/feed/rss/').read()
        data=data[data.find('<item>')+16:]
        title=data[0:data.find("</title>")]
        data=data[data.find('<link>')+6:]
        data=data[0:data.find("</link>")]
        return 'Last Post: '+title+" - "+data

def help(data):
        data=data.replace('!','')
        helps={
                'status':'!status returns the current status of the space. (open/closed)',
                'sign':'!sign returns or updates the text displayed on the prolite LED sign.',
                'tweet':'!tweet returns the latest tweet on the @Unallocated twitter account.',
                'site':'!site returns the latest blog post on http://unallocatedspace.org/',
                'mc':'!mc facilitates live communication with people playing on the Unallocated Minecraft server. (not active right now)',
                'rollcall':'!rollcall lists Unallocated Space members that have checked into the space with their UAS member smart cards during the current session (opening to closing)',
                'phone':'!phone prints the phone number of the space. 512-943-2827. ooh how meta.',
                'weather':'!weather returns the weather conditions outside the space.',
                'address':address(None),
                'request':'!request is used to make improvment or feature requests for UnalloBot.'
                }
        return helps[data] if data in helps else 'Available commands are: !'+' !'.join(helps.keys())

def sign(data):	
        try:
                if data=="":
                        message='The last sign update read as: '+open('/tmp/sign','r').read()
                else:
                        if '<FO>' in data:
                                message="<FO> is not allowed"
                        else:
                                s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                                s.connect(('127.0.0.1',9001))
                                s.sendall(data)
                                message=s.recv(1024)
                                s.close()
					
        except socket.error:
                message="Failed to update sign"
        return message

def weather(data):
	usock = urllib.urlopen('http://www.google.com/ig/api?weather=21144')
	xmldoc = minidom.parse(usock)
	usock.close()
	data=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('condition')[0].getAttribute('data').strip() + ' - '
	data+="Temp: "+xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('temp_f')[0].getAttribute('data').strip() + ' - '
	data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('humidity')[0].getAttribute('data').strip() + ' - '
	data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('wind_condition')[0].getAttribute('data').strip()
	return data

def mcpipe(data):#fix for the securities
	return 'Not right now.'
	os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
	return ''

def rollcall(data):
        status=open("/tmp/status").read()
        if status[0:1]=="+":
                peps=open("/uas/smart/whoishere").read().strip()
                peeps = ', '.join(list(set(peps.split('\n'))))
                if peeps.strip() != "":
                        return "The following people have checked into the space this session. "+peeps[0:]
                else:
                        return "No one has checked into the space this session."
        else:
                return "The space is closed, Rollcall is not allowed"

def goingson(data): #this may be removed....
	os.system("echo '"+status(None)+"' > /uas/irc/irc ")
	time.sleep(.1)
	os.system("echo '"+rollcall(None)+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+sign("")+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+site(None)+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+tweet(None)+"' > /uas/irc/irc ")
	time.sleep(.1)
        os.system("echo '"+weather(None)+"' > /uas/irc/irc ")
	return ""

def request(data): #this may be removed....
	if data != "":
	        f=open('requests.txt','a')
	        f.write(data+"\n\n")
	        f.close()
	        return "Thank you for the feature request."
	else:
		return "Use this command with text to request new features."

def alert(data):
	os.system("python /uas/ippower/alert.py &")
	return "Alert Sent."

def trollcall(data):
	trollface=rollcall(data)
	return trollface.replace('the space this session. ','your mom. ')	

def pronto(data):
	return "damnit pronto....."

def phone(data):
	return "Call us at 512-943-2827!"

def address(data):
	return "512 Shaw CT Suite 105, Severn MD 21144"

def update(data):
        reload(botfunc)


commands=          {'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'mc':mcpipe,'phone':phone,'address':address,'weather':weather,'goingson':goingson,'request':request,'alert':alert,'help':help,    'space':status,'blog':site,'commands':help,'twit':tweet,'twat':tweet,'brocall':rollcall,'trollcall':trollcall,'bagels':pronto,'allthethings':goingson}

responder_commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'weather':weather,'address':address}