sys.setdefaultencoding("utf-8")
sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
+
# Find the best reactor
selectWarning = "Unable to install any good reactors (kqueue, epoll, poll).\nWe fell back to using select. You may have scalability problems.\nThis reactor will not support more than 1024 connections at a time."
-try:
- from twisted.internet import epollreactor as bestreactor
-except:
+reactors = [("epollreactor", True), ("pollreactor", True), ("selectreactor", False), ("default", False)]
+for tryReactor, good in reactors:
try:
- from twisted.internet import kqreactor as bestreactor
- except:
- try:
- from twisted.internet import pollreactor as bestreactor
- except:
- try:
- from twisted.internet import selectreactor as bestreactor
- print selectWarning
- except:
- try:
- from twisted.internet import default as bestreactor
- print selectWarning
- except:
- print "Unable to find a reactor. Please make sure you have Twisted properly installed.\nExiting..."
- sys.exit(1)
-bestreactor.install()
+ bestReactor = __import__("twisted.internet." + tryReactor)
+ if not good:
+ print >> sys.stderr, selectWarning
+ break
+ except ImportError:
+ pass
+else:
+ print >> sys.stderr, "Unable to find a reactor. Please make sure you have Twisted properly installed.\nExiting..."
+ sys.exit(1)
+
+import twistfix
+twistfix.main()
# Must load config before everything else
from twisted.internet import kqreactor
kqreactor.install()
elif len(config.reactor) > 0:
- print "Unknown reactor: ", config.reactor, ". Using select(), reactor."
+ print >> sys.stderr, "Unknown reactor: ", config.reactor, ". Using best available reactor."
from twisted.internet import reactor, task
from twisted.internet.defer import Deferred
-from tlib.xmlw import Element, jid, component
+from twisted.words.xish.domish import Element
+from twisted.words.protocols.jabber import component
+from twisted.words.protocols.jabber.jid import internJID
+
from debug import LogEvent, INFO, WARN, ERROR
import debug
-import svninfo
import utils
import xdb
import avatar
class PyTransport(component.Service):
def __init__(self):
LogEvent(INFO)
- try:
- LogEvent(INFO, msg="SVN r" + str(svninfo.getSVNVersion()))
- except:
- pass
+ LogEvent(INFO, msg="Reactor: " + str(reactor))
# Discovery, as well as some builtin features
self.discovery = disco.ServerDiscovery(self)
self.discovery.addFeature(disco.XCONFERENCE, None, config.jid) # So that clients know you can create groupchat rooms on the server
self.discovery.addFeature("jabber:iq:conference", None, config.jid) # We don't actually support this, but Psi has a bug where it looks for this instead of the above
self.discovery.addIdentity("client", "pc", "MSN Messenger", "USER")
+ self.discovery.addIdentity("conference", "text", "MSN Groupchat", "ROOM")
self.xdb = xdb.XDB(config.jid, legacy.mangle)
self.avatarCache = avatar.AvatarCache()
def onMessage(self, el):
fro = el.getAttribute("from")
try:
- froj = jid.intern(fro)
+ froj = internJID(fro)
except Exception, e:
LogEvent(WARN, "", "Failed stringprep.")
return
fro = el.getAttribute("from")
to = el.getAttribute("to")
try:
- froj = jid.intern(fro)
- toj = jid.intern(to)
+ froj = internJID(fro)
+ toj = internJID(to)
except Exception, e:
LogEvent(WARN, "", "Failed stringprep.")
return
# Set SIGHUP to reload the config file & close & open debug file
signal.signal(signal.SIGHUP, SIGHUPstuff)
# Load some scripts for PID and daemonising
- from twisted.scripts import twistd
+ from twisted.scripts import _twistd_unix as twistd
def main():