/src/groupchat.py

http://pyaimt.googlecode.com/ · Python · 157 lines · 119 code · 25 blank · 13 comment · 20 complexity · 3b649972baa3054f134aa149cd13ca4e MD5 · raw file

  1. # Copyright 2004-2006 Daniel Henninger <jadestorm@nc.rr.com>
  2. # Licensed for distribution under the GPL version 2, check COPYING for details
  3. import utils
  4. from twisted.internet import reactor
  5. from twisted.words.xish.domish import Element, SuxElementStream
  6. import jabw
  7. import config
  8. from debug import LogEvent, INFO, WARN, ERROR
  9. import lang
  10. import string
  11. import time
  12. class BaseGroupchat:
  13. """ A class to map a groupchat from a legacy service back to the Jabber user """
  14. def __init__(self, session, resource, ID=None):
  15. self.session = session
  16. self.session.groupchats.append(self)
  17. self.nick = resource
  18. if ID:
  19. self.ID = ID
  20. self.session.pytrans.reserveID(self.ID)
  21. else:
  22. self.ID = self.session.pytrans.makeID()
  23. self.ready = False # Is True only after the user has joined
  24. self.messageBuffer = []
  25. self.contacts = []
  26. self.checkTimer = reactor.callLater(120.0, self.checkUserJoined, None)
  27. LogEvent(INFO, self.session.jabberID)
  28. def removeMe(self):
  29. """ Cleanly removes the object """
  30. self.session.groupchats.remove(self)
  31. if self.ready:
  32. self.session.sendPresence(to=self.user(), fro=self.roomJID() + "/" + self.nick, ptype="unavailable")
  33. self.ready = False
  34. self.session = None
  35. if self.checkTimer and not self.checkTimer.called:
  36. self.checkTimer.cancel()
  37. self.checkTimer = None
  38. utils.mutilateMe(self)
  39. LogEvent(INFO, self.session.jabberID)
  40. def roomJID(self):
  41. """ Returns the room JID """
  42. return self.ID + "@" + config.confjid
  43. def user(self):
  44. """ Returns the full JID of the Jabber user in this groupchat """
  45. jid = self.session.jabberID
  46. # FIXME, this probably won't work with multiple resources (unless you're using the highest resource)
  47. # if(self.resource):
  48. # jid += "/" + self.resource
  49. return jid
  50. def checkUserJoined(self, ignored=None):
  51. self.checkTimer = None
  52. if not self.ready:
  53. LogEvent(INFO, self.session.jabberID, "Join timeout after two minutes.")
  54. text = []
  55. text.append(lang.get("groupchatfailjoin1", self.session.lang) % (self.roomJID()))
  56. for contact in self.contacts:
  57. text.append("\t%s" % (contact))
  58. text.append("")
  59. text.append(lang.get("groupchatfailjoin2", self.session.lang))
  60. text.append("")
  61. for (source, message, timestamp) in self.messageBuffer:
  62. if source:
  63. text.append("%s says: %s" % (source, message))
  64. else:
  65. text.append(message)
  66. body = string.join(text, "\n")
  67. self.session.sendMessage(to=self.user(), fro=config.confjid, body=body)
  68. self.removeMe()
  69. def sendUserInvite(self, fro):
  70. """ Sends the invitation out to the Jabber user to join this room """
  71. el = Element((None, "message"))
  72. el.attributes["from"] = fro
  73. el.attributes["to"] = self.user()
  74. body = el.addElement("body")
  75. text = lang.get("groupchatinvite", self.session.lang) % (self.roomJID())
  76. body.addContent(text)
  77. x = el.addElement("x")
  78. x.attributes["jid"] = self.roomJID()
  79. x.attributes["xmlns"] = globals.XCONFERENCE
  80. LogEvent(INFO,self.session.jabberID)
  81. self.session.pytrans.send(el)
  82. def userJoined(self, nick):
  83. # Send any buffered messages
  84. self.nick = nick
  85. if not self.nick:
  86. self.nick = self.session.username
  87. self.session.sendPresence(to=self.user(), fro=self.roomJID() + "/" + self.nick)
  88. if not self.ready:
  89. LogEvent(INFO, self.session.jabberID)
  90. self.ready = True
  91. for (source, text, timestamp) in self.messageBuffer:
  92. self.messageReceived(source, text, timestamp)
  93. self.messageBuffer = None
  94. for contact in self.contacts:
  95. self.contactPresenceChanged(contact)
  96. def contactJoined(self, contact):
  97. if self.contacts.count(contact) == 0:
  98. self.contacts.append(contact)
  99. LogEvent(INFO, self.session.jabberID)
  100. self.contactPresenceChanged(contact)
  101. self.messageReceived(None, "%s has joined the conference." % (contact))
  102. def contactLeft(self, contact):
  103. if self.contacts.count(contact) > 0:
  104. self.contacts.remove(contact)
  105. LogEvent(INFO, self.session.jabberID)
  106. self.contactPresenceChanged(contact, ptype="unavailable")
  107. self.messageReceived(None, "%s has left the conference." % (contact))
  108. def messageReceived(self, source, message, timestamp=None):
  109. if not self.ready:
  110. timestamp = time.strftime("%Y%m%dT%H:%M:%S")
  111. self.messageBuffer.append((source, message, timestamp))
  112. else:
  113. self.session.pytrans.statistics.stats['IncomingMessages'] += 1
  114. fro = self.roomJID()
  115. if source:
  116. fro += "/" + source
  117. LogEvent(INFO, self.session.jabberID)
  118. self.session.sendMessage(to=self.user(), fro=fro, body=message, mtype="groupchat", delay=timestamp)
  119. def contactPresenceChanged(self, contact, ptype=None):
  120. if self.session:
  121. fro = self.roomJID() + "/" + contact
  122. self.session.sendPresence(to=self.user(), fro=fro, ptype=ptype)
  123. def sendMessage(self, text, noerror):
  124. LogEvent(INFO, self.session.jabberID)
  125. self.messageReceived(self.nick, text)
  126. self.sendLegacyMessage(text, noerror)
  127. def sendLegacyMessage(self, text):
  128. """ Reimplement this to send the packet to the legacy service """
  129. pass
  130. def sendContactInvite(self, contact):
  131. """ Reimplement this to send the packet to the legacy service """
  132. pass