title: Chatbot Conversation Objects, your approach?
body: <p>I'm relatively new to programming and a recent project I've started to work on is a chatbot in python for an irc channel I frequent.
  One of my goals is to have the bot able to very basically keep track of conversations it is having with users.
  I presently an using conversation objects. When a user addresses the bot, it creates a new convo object and stores a log of the conversation, the current topic, etc. in that object.
  When the user speaks, if their message matches the topic of the conversation, it chooses a response based on what they've said and the new topic.</p>
  
  <p>For example, if the bot joins, and a user says: "Hello, bot." the conversation will be created and the topic set to "greeting".
  the bot will say hello back and if the user asks: "What's up?", the bot will change the topic to "currentevents", and reply with "not much" or similar. 
  topic have related topic, and if the bot notices a sudden change to a topic not marked as related (questions are exceptions), it will act slightly confused and taken aback.</p>
  
  <p>My question is though: I feel like my method is a bit overly complicated and unnecessary. I'm sure objects aren't the best thing to use. What would be another approach to keeping track of a conversation and it's topic? Be it a better way or worse, I'm just looking for ideas and a little brainstorming.</p>
  
  <p>Before you say this isn't the right place, I've tried asking on programmers.stackexchange.com, but I didn't receive a relevant response, just someone who misunderstood me. I'm hoping I can get some more feedback on a more active site. In a way this is code help :)</p>
  
  <p>Here's the code for my current approach. There are still a few bugs and I'm sure the code is far from efficient. Any tips or help on the code is welcomed.</p>
  
  <pre><code>def __init__(slef):
      self.dicti_topics = {"None":["welcomed", "ask", "badbot", "leave"],
                           "welcomed":["welcomed", "howare", "badbot", "ask", "leave"],
                           "howare":["greetfinished", "badbot", "leave"]}
  
      self.dicti_lines = {"hello":"welcomed", "howareyou":"howare", "goaway":"leave", "you'rebad":"badbot", "question":"asked"}
      self.dicti_responce = dicti["Arriving dicti_responce"]
  
  def do_actions(self):
      if len(noi.recv) &gt; 0:
          line = False
          ##set vars
          item = noi.recv.pop(0)
  
          #update and trim lastrecv list
          noi.lastrecv.append(item)
          if len(noi.lastrecv) &gt; 10: noi.lastrecv = noi.lastrecv[1:10]
  
          args = item.split()
          channel, user = args[0], args[1].split("!")[0]
          message = " ".join(w for w in args[2:])
          print "channel:", channel
          print "User:", user
          print "Message:", message
  
  
          if re.match("noi", message):
              if not user in noi.convos.keys():
                  noi.convos[user] = []
              if not noi.convos[user]:
                  noi.convos[user] = Conversation(user)
                  noi.convos[user].channel = channel
  
                  line = "What?"
                  send(channel, line)
          if re.match("hello|yo|hey|ohai|ello|howdy|hi", message) and (noi.jointime - time.time() &lt; 20):
              print "hello convo created"
              if not user in noi.convos.keys():
                  noi.convos[user] = []
              if not noi.convos[user]:
                  noi.convos[user] = Conversation(user, "welcomed")
                  noi.convos[user].channel = channel
  
  
  
          #if user has an active convo
          if user in noi.convos.keys():
              ##setvars
              line = None
              convo = noi.convos[user]
              topic = convo.topic
  
  
              #remove punctuation, "noi", and make lowercase
              rmsg = message.lower()
              for c in [".", ",", "?", "!", ";"]:
                  rmsg = rmsg.replace(c, "")
                  #print rmsg
              rlist = rmsg.split("noi")
  
  
              for rmsg in rlist:
                  rmsg.strip(" ")
  
  
                  #categorize message
                  if rmsg in ["hello", "yo", "hey", "ohai", "ello", "howdy", "hi"]: rmsg = "hello"
                  if rmsg in ["how do you do", "how are you", "sup", "what's up"]: rmsg = "howareyou"
                  if rmsg in ["gtfo", "go away", "shooo", "please leave", "leave"]: rmsg = "goaway"
                  if rmsg in ["you're bad", "bad bot", "stfu", "stupid bot"]: rmsg = "you'rebad"
                  #if rmsg in []: rmsg = 
                  #if rmsg in []: rmsg =
  
  
                  #Question handling
                  r = r'(when|what|who|where|how) (are|is) (.*)'
                  m = re.match(r, rmsg)
                  if m: 
                      rmsg = "question"
                      responce = "I don't know %s %s %s." % (m.group(1), m.group(3), m.group(2))
  
  
                  #dicti_lines -&gt; {message: new_topic}
                  #if msg has an entry, get the new associated topic
                  if rmsg in self.dicti_lines.keys():
                      new_topic = self.dicti_lines[rmsg]
  
                      #dicti_topics
                      relatedtopics = self.dicti_topics[topic]
                      #if the topic is related, change topic
                      if new_topic in relatedtopics:
                          convo.change_topic(new_topic)
                          noi.convos[user] = convo
                          #and respond
                          if new_topic == "leave": line = random.choice(dicti["Confirm"])
                          if rmsg == "question": line = responce
                          else: line = random.choice(self.dicti_responce[new_topic])
  
                      #otherwise it's confused
                      else:
                          line = "Huh?"
  
  
                  if line:
                      line = line+", %s." % user
                      send(channel, line)
  </code></pre>
  
  <p>This is the do_action of a state in a state machine.</p>