text: #!/usr/bin/env python
  
  # Copyright (c) Twisted Matrix Laboratories.
  # See LICENSE for details.
  
  
  """
  A very simple twisted.words.im-based logbot.
  
  To run the script:
  $ python minchat.py
  """
  
  from twisted.words.im import basechat, baseaccount, ircsupport
  
  
  # A list of account objects. We might as well create them at runtime, this is
  # supposed to be a Minimalist Implementation, after all.
  
  accounts = [
      ircsupport.IRCAccount("IRC", 1,
          "Tooty",            # nickname
          "",                 # passwd
          "irc.freenode.net", # irc server
          6667,               # port
          "#twisted",         # comma-separated list of channels
      )
  ]
  
  
  class AccountManager (baseaccount.AccountManager):
      """
      This class is a minimal implementation of the Account Manager.
  
      Most implementations will show some screen that lets the user add and
      remove accounts, but we're not quite that sophisticated.
      """
  
      def __init__(self):
  
          self.chatui = MinChat()
  
          if len(accounts) == 0:
              print "You have defined no accounts."
          for acct in accounts:
              acct.logOn(self.chatui)
  
  
  class MinConversation(basechat.Conversation):
      """
      This class is a minimal implementation of the abstract Conversation class.
  
      This is all you need to override to receive one-on-one messages.
      """
      def show(self):
          """
          If you don't have a GUI, this is a no-op.
          """
          pass
      
      def hide(self):
          """
          If you don't have a GUI, this is a no-op.
          """
          pass
      
      def showMessage(self, text, metadata=None):
          print "<%s> %s" % (self.person.name, text)
          
      def contactChangedNick(self, person, newnick):
          basechat.Conversation.contactChangedNick(self, person, newnick)
          print "-!- %s is now known as %s" % (person.name, newnick)
  
  
  class MinGroupConversation(basechat.GroupConversation):
      """
      This class is a minimal implementation of the abstract GroupConversation class.
  
      This is all you need to override to listen in on a group conversaion.
      """
      def show(self):
          """
          If you don't have a GUI, this is a no-op.
          """
          pass
  
      def hide(self):
          """
          If you don't have a GUI, this is a no-op.
          """
          pass
  
      def showGroupMessage(self, sender, text, metadata=None):
          print "<%s/%s> %s" % (sender, self.group.name, text)
  
      def setTopic(self, topic, author):
          print "-!- %s set the topic of %s to: %s" % (author, 
              self.group.name, topic)
  
      def memberJoined(self, member):
          basechat.GroupConversation.memberJoined(self, member)
          print "-!- %s joined %s" % (member, self.group.name)
  
      def memberChangedNick(self, oldnick, newnick):
          basechat.GroupConversation.memberChangedNick(self, oldnick, newnick)
          print "-!- %s is now known as %s in %s" % (oldnick, newnick,
              self.group.name)
  
      def memberLeft(self, member):
          basechat.GroupConversation.memberLeft(self, member)
          print "-!- %s left %s" % (member, self.group.name)
  
  
  class MinChat(basechat.ChatUI):
      """
      This class is a minimal implementation of the abstract ChatUI class.
  
      There are only two methods that need overriding - and of those two, 
      the only change that needs to be made is the default value of the Class
      parameter.
      """
  
      def getGroupConversation(self, group, Class=MinGroupConversation, 
          stayHidden=0):
  
          return basechat.ChatUI.getGroupConversation(self, group, Class, 
              stayHidden)
  
      def getConversation(self, person, Class=MinConversation, 
          stayHidden=0):
  
          return basechat.ChatUI.getConversation(self, person, Class, stayHidden)
  
  
  if __name__ == "__main__":
      from twisted.internet import reactor
  
      AccountManager()
  
      reactor.run()
  