From 15a8da0a356515e20d58cef9fdeb8dc8b873765a Mon Sep 17 00:00:00 2001 From: Shauna Date: Fri, 10 Jan 2014 20:19:10 -0500 Subject: [PATCH] cleaned up, added nicks.csv & funcs to access it --- bot.py | 116 ++++++++++++++++++++++++++++++++---------------------- nicks.csv | 2 + 2 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 nicks.csv diff --git a/bot.py b/bot.py index 13a5570..72b3523 100644 --- a/bot.py +++ b/bot.py @@ -1,14 +1,16 @@ # Import some necessary libraries. import socket import time +import csv import Queue import random from threading import Thread # Some basic variables used to configure the bot -server = "irc.freenode.net" # Server -channel = "#openscienceframework" # Channel -botnick = "ShaunaBot" # Your bots nick +server = "irc.freenode.net" +channel = "#openhatch" +botnick = "WelcomeBot" +waitTime = 60 # Amount of time after joining before bot replies to someone # Connects to server and joins channel ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -16,18 +18,18 @@ ircsock.connect((server, 6667)) # Here we connect to the server using the port 6 ircsock.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :This bot is a result of a tutoral covered on http://shellium.org/wiki.\n") # user authentication ircsock.send("NICK "+ botnick +"\n") # here we actually assign the nick to the bot -def joinchan(chan): # This function is used to join channels. - ircsock.send("JOIN "+ chan +"\n") +def joinchan(chan): + ircsock.send("JOIN "+ chan +"\n") joinchan(channel) # Creates separate thread for reading messages from the server def getIRC(): - while True: - ircmsg = ircsock.recv(2048) # receive data from the server - ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks. - q.put(ircmsg) # Put in queue for main loop to read - print(ircmsg) + while True: + ircmsg = ircsock.recv(2048) # receive data from the server + ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks. + q.put(ircmsg) # Put in queue for main loop to read + print(ircmsg) q = Queue.LifoQueue() t = Thread(target=getIRC) @@ -37,63 +39,83 @@ t.start() # Classes class newcomer(object): # Newcomer class created when someone joins the room - def __init__(self, nick): - self.nick = nick - self.born = time.time() - self.status = 0 + def __init__(self, nick): + self.nick = nick + self.born = time.time() + self.status = 0 - def changeStatus(self,status): - self.status = status # Right now there's just status 0 (not replied to) and 1 (replied to) + def updateStatus(self,status=0): + self.status = status - def aroundFor(self): - return time.time() - self.born + def aroundFor(self): + return time.time() - self.born # Functions def ping(): # Responds to server Pings. - ircsock.send("PONG :pingis\n") + ircsock.send("PONG :pingis\n") -def hello(speaker,greeting): # This function responds to a user that inputs "Hello Mybot" - ircsock.send("PRIVMSG " + channel +" :" + greeting + " " + speaker + "\n") +def hello(actor,greeting): # This function responds to a user that inputs "Hello Mybot" + ircsock.send("PRIVMSG " + channel +" :" + greeting + " " + actor + "\n") -def help(speaker): # This function explains what the bot is when queried. - ircsock.send("PRIVMSG " + channel +" :I'm a bot! I'm from here: https://github.com/shaunagm/oh-irc-bot. You can change my behavior by submitting a pull request or by talking to shauna. \n") +def help(actor): # This function explains what the bot is when queried. + ircsock.send("PRIVMSG " + channel +" :I'm a bot! I'm from here: https://github.com/shaunagm/oh-irc-bot. You can change my behavior by submitting a pull request or by talking to shauna. \n") def welcome(newcomer): # This welcomes a specific person. - ircsock.send("PRIVMSG "+ channel +" :Welcome "+ newcomer + "!\n") - ircsock.send("PRIVMSG "+ channel +" :(pssst shauna there's someone here)\n") + ircsock.send("PRIVMSG "+ channel +" :Welcome "+ newcomer + "! The channel's pretty quiet right now, so I thought I'd say hello, and ping my maintainers(shauna, paulproteus) that you're here. If no one responds for a while, try emailing us at hello@openhatch.org or just coming back later.\n") + +def makeNickArray(): # On startup, makes array of nicks from Nicks.txt. New info will be written to both array and txt file. + nickArray = [] + with open('nicks.csv', 'rb') as csvfile: + nicksData = csv.reader(csvfile, delimiter=',', quotechar='|') + for row in nicksData: + nickArray.append(row) + # Do I need to explicitly close this? + +def addPerson(person): # After a newcomer has been greeted (either by the bot, or someone else) their information will be set recorded. + nicksData.append(person) + with open('nicks.csv', 'wb') as csvfile: + nickwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) + nickwriter.writerow([person]) #### Main function -newList = [] +newList = [] # This is the array of newcomer objects that people who join the room are added to. helloArray = ['Hello','hello','Hi','hi','Hey','hey','Yo','yo ','Sup','sup'] helpArray = ['Help','help','Info','info','faq','FAQ','explain yourself','EXPLAIN YOURSELF'] while 1: - for i in newList: - if i.aroundFor() > 5 and i.status == 0: - print welcome(i.nick) - i.changeStatus(2) + for i in newList: + i.updateStatus() + if i.status == 0 and i.aroundFor > waitTime: + welcome(i.nick) + i.updateStatus(1) + addPerson(i) - if q.empty() == 0: - ircmsg = q.get() - speaker = ircmsg.split(":")[1].split("!")[0] + if q.empty() == 0: + ircmsg = q.get() + actor = ircmsg.split(":")[1].split("!")[0] - if ircmsg.find("PRIVMSG "+ channel) != -1: # If someone has spoken into the channel - for i in newList: - if speaker != i.nick: # Don't turn off response if the person speaking is the person who joined. - i.changeStatus(1) # set status to "someone has spoken in channel" for all waiting newcomers + # Welcome functions + if ircmsg.find("PRIVMSG "+ channel) != -1: # If someone has spoken into the channel + for i in newList: + if actor != i.nick: # Don't turn off response if the person speaking is the person who joined. + i.updateStatus(1) # Sets status to 1 + addPerson(i) + ## Else: Do we want to do something if the person who joined the chat says something? - if ircmsg.find(botnick) != -1 and ircmsg.find("PRIVMSG #") != -1: # If someone talks to (or refers to) the bot - if any(x in ircmsg for x in helloArray): - hello(speaker,random.choice(helloArray)) - if any(y in ircmsg for y in helpArray): - help(speaker) + if ircmsg.find("JOIN "+ channel) != -1: # If someone joins #channel + if actor != botnick: # Remove the case where the bot gets a message that the bot has joined. + if actor not in nickArray: + newList.append(newcomer(actor)) # Create a newcomer object and append to list. - if ircmsg.find("PING :") != -1: # if the server pings us then we've got to respond! - ping() + # Unwelcome functions + if ircmsg.find(botnick) != -1 and ircmsg.find("PRIVMSG #") != -1: # If someone talks to (or refers to) the bot + if any(x in ircmsg for x in helloArray): + hello(actor,random.choice(helloArray)) + if any(y in ircmsg for y in helpArray): + help(actor) - if ircmsg.find("JOIN "+ channel) != -1: # If someone joins #channel - if speaker != botnick: # Probably a cleaner way to do this - newList.append(newcomer(speaker)) # Create a newcomer object and append to list. + if ircmsg.find("PING :") != -1: # if the server pings us then we've got to respond! + ping() diff --git a/nicks.csv b/nicks.csv new file mode 100644 index 0000000..98a6548 --- /dev/null +++ b/nicks.csv @@ -0,0 +1,2 @@ +paulproteus, shauna, britta, skay +