#!/usr/bin/python2.4 from twisted.words.protocols.irc import IRC from twisted.internet import reactor, protocol, defer from twisted.words import iwords, ewords from twisted.words.service import IRCFactory, WordsRealm, InMemoryWordsRealm from twisted.cred import portal, checkers, credentials from twisted.internet.defer import maybeDeferred from twisted.python import failure, reflect, components from zope.interface import implements from zope import interface import IRCServer, Data #import Services SERVERNAME = "ares.shadowfire.org" DOMAIN = "shadowfire.org" PORT = 6667 CSERVER = "devsrv.shadowfire.org" CPASSWORD = "test" #CSERVER = "mikomi.shadowfire.org" #CPASSWORD = "ehzWx5qyN9r96" #PORT = 7354 dataStore = Data.GroupData() class ApolloProtocol(IRCServer.IRCService): rPass = CPASSWORD users = {} def connectionMade(self): print "Hello @ new person.." def newConnection(self, name): # A method to do stuff when people connect to the network pass def irc_AWAY(self, prefix, params): pass def irc_NICK(self, prefix, params): #self.users[params[0]] = (params[4], params[5], params[7]) user = params[0].lower() if prefix: # User renamed self.users[user] = self.users[prefix.lower()] del self.users[prefix.lower()] oldMask = self.users[user][0].split('!',1)[1] self.users[user][0] = "%s!%s" % (params[0], oldMask) else: # New user self.users[user] = ["%s!%s@%s" % (params[0],params[3],params[4]), params[5], params[7], ""] self.newConnection(user) print "NICK ", prefix, params def irc_QUIT(self, prefix, params): print "QUIT", params, prefix def irc_SENDSNO(self, prefix, params): pass def irc_PROTOCTL(self, prefix, params): print "Got PROTOCTL" self.sendLine("PROTOCTL : NOQUIT CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMTG NICKCHARS=") def irc_NAMES(self, prefix, params): pass def irc_JOIN(self, prefix, params): pass def irc_MODE(self, prefix, params): userOrChan = params[0].lower() if "#" in userOrChan: # channel mode pass else: user = userOrChan if "+" in params[1]: self.users[user][3] += params[1][1:] modes = self.users[user][3] if "O" or "o" in modes: if self.realm.db.unauthAdmin(user): self.realm.db.authAdmins.append(user) print user, "is now an Ares admin." else: modes = self.users[user][3] for l in params[1][1:]: modes = modes.replace(l, '') self.users[user][3] = modes def irc_SERVER(self, prefix, params): """[Nov 08 01:51:01.674013 2006] debug: Sent: SERVER devsvs.shadowfire.org 1 :U0-*-2 Services for IRC Networks [Nov 08 01:51:01.918801 2006] debug: Sent: NICK OperServ 1 1162943461 services example.net devsvs.shadowfire.org 0 +oiSqd example.net :Operator Server [Nov 08 01:51:01.919041 2006] debug: Sent: NICK Global 1 1162943461 services example.net devsvs.shadowfire.org 0 +oiSqd example.net :Global Noticer """ print "Got Server", params if params[0].lower()==CSERVER and self.password==CPASSWORD: self.sendLine("PASS :%s" % (CPASSWORD,)) self.sendLine("SERVER %s 1 :Test Service" % SERVERNAME) self.sendLine("NICK AresServ 1 1162943461 aresserv %s %s 0 +oiSqd %s :Dev service" % (DOMAIN, SERVERNAME, DOMAIN)) else: print "I don't care about this server..." def stripNickname(self, nick): # Returns a nickname with all the crap stripped out rubish = ['`', '[', ']', '\\', '^', '{', '}'] for c in rubish: nick = nick.replace(c, '') return nick def forceMask(self, user, mask): userS = self.stripNickname(user) print "Setting mask and ident on user" line = "CHGHOST %s %s.%s" % (user, userS, mask) print "Send>", line self.sendLine(line) line = "CHGIDENT %s %s" % (user, userS[:10]) print "Send>", line self.sendLine(line) def irc_SVSMODE(self, prefix, params): try: self.irc_MODE(prefix, params) except KeyError: pass if params[1]=="+r": print params[0], "is now a registered user." if self.realm.db.unauthAdmin(params[0]): self.realm.db.authAdmins.append(params[0].lower()) print params[0], "is now an Ares admin." newMask = self.realm.db.getMask(params[0]) if newMask: self.forceMask(params[0], newMask) return elif self.realm.db.unauthUser(params[0]): self.AresService.bitchAtUser(params[0], self) else: print "Got SVSMODE ", params def irc_432(self, prefix, params): #print "432... ", params pass def irc_TKL(self, prefix, params): #print "TKL ", params pass def irc_SVSNICK(self, prefix, params): print "SVSNICK ", params def irc_462(self, prefix, params): print params, ":(" def irc_ERROR(self, prefix, params): print "Server error, ", params def irc_NOTICE(self, prefix, params): print "Notice: ", params def irc_NETINFO(self, prefix, params): #print "NETINFO ", params pass def irc_EOS(self, prefix, params): #print "EOS ", params pass def irc_SETHOST(self, prefix, params): #print "SETHOST ", params pass def irc_GLOBOPS(self, prefix, params): print "Global notice: ", ' '.join(params) def irc_SMO(self, prefix, params): #print "SMO ", params pass def irc_SQUIT(self, prefix, params): # no idea what to do with this... print "SQUIT ", params[0] def irc_PONG(self, prefix, params): #self.sendMessage('PING', self.hostname) pass class ServerMain: def __init__(self, configFile): self.configFile = configFile pass def readConfig(self): fi = open(self.configFile).read() exec fi class DontCare: implements(checkers.ICredentialsChecker) credentialInterfaces = credentials.IUsernamePassword, def __init__(self): pass def requestAvatarId(self, credentials): return credentials.username class ircPortal(portal.Portal): def login(self, mask, credentials, mind, *interfaces): ifac = interface.providedBy(credentials) for i in ifac: c = self.checkers.get(i) if c is not None: return maybeDeferred(c.requestAvatarId, credentials ).addCallback(self.realm.requestAvatar, mind, mask, *interfaces ) return defer.fail(failure.Failure(error.UnhandledCredentials( "No checker for %s" % ', '.join(map(reflect.qual, ifac))))) def createPortal(realm): porta = ircPortal(realm, [DontCare()]) checker = DontCare() #porta.registerChecker(checker) #porta.registerChecker(checkers.AllowAnonymousAccess, credentials.IAnonymous) return porta if __name__ == '__main__': realm = IRCServer.IRCRealm(dataStore, SERVERNAME) factory = IRCFactory(realm, createPortal(realm)) factory.protocol = ApolloProtocol factory.protocol.realm = realm reactor.listenTCP(PORT,factory) reactor.run()