rdsedmundo

Transformice Source Code Republished

Sep 20th, 2011
5,271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 49.55 KB | None | 0 0
  1. # By Kyl3 aka edi472
  2. # Transformice Private Server 0.55 Source
  3. # The copy-source is released
  4. # http://webcheats.com.br
  5. import random
  6. import socket, asyncore, asynchat
  7. import thread, threading
  8. import time
  9. import types
  10. import re
  11. import base64, binascii, hashlib
  12. import logging
  13.  
  14. from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
  15.  
  16. logging.basicConfig(filename='Archives.html',level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
  17.  
  18.  
  19. VERBOSE = False
  20. VERSION = "0.55 "
  21.  
  22. ADMIN_NAME = "Admin"
  23. ADMIN_NAMES = frozenset(['Admin', 'admin', 'Phoenix', 'Tigrounette', 'Melibellule', 'Jonathan', 'Modogeek', 'Mododivin', 'Modoplouf', 'Modotruc'])
  24. ADMIN_HASH = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
  25.  
  26. LEVEL_LIST = range(0, 100+1) + range(901, 910+1)
  27. #0 to 100 are normal maps, 901 to 910 are replaced with nightmode maps.
  28. #901    1006
  29. #902    1007 (No Shaman)
  30. #903    1015
  31. #904    1027
  32. #905    1040
  33. #906    1062
  34. #907    1067
  35. #908    1087 (Shaman only on nightmode)
  36. #909    1088 (Shaman only on nightmode)
  37. #910    1092 (Shaman only on nightmode)
  38.  
  39. class TransformiceServer(asyncore.dispatcher):
  40.     def __init__(self, HOST='', PORT=1111):
  41.  
  42.         self.HOST = HOST
  43.         self.PORT = PORT
  44.  
  45.         asyncore.dispatcher.__init__(self)
  46.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  47.  
  48.         # try to re-use a server port if possible
  49.         self.set_reuse_addr()
  50.         self.bind((self.HOST, self.PORT))
  51.         self.listen(5)
  52.  
  53.         logging.info("running")
  54.  
  55.         #self.clients = []
  56.  
  57.         self.rooms = {}
  58.  
  59.     def handle_accept(self):
  60.         socket, addr = self.accept()
  61.  
  62.         TransformiceClientHandler(self, socket, addr)
  63.  
  64.     def authenticate(self, username, passwordHash):
  65.         #authentication
  66.         if username.strip().lower() in ADMIN_NAMES:
  67.             if passwordHash != ADMIN_HASH:
  68.                 return -1 #Invalid
  69.  
  70.             return 10 #Admin
  71.  
  72.         return 1 #Normal Player
  73.  
  74.     def createAccount(self, username, passwordHash):
  75.         pass
  76.  
  77.     def sendPrivMsg(self, fromUsername, toUsername, message):
  78.  
  79.         found = False
  80.         for room in self.rooms.itervalues():
  81.             for player in room.clients.itervalues():
  82.                 if player.username.lower() == toUsername.lower():
  83.                     player.sendRecievePrivMsg(fromUsername, message)
  84.                     found = True
  85.         return found
  86.  
  87.     def addClientToRoom(self, client, roomName):
  88.         roomName = str(roomName)
  89.         if self.rooms.has_key(roomName):
  90.             self.rooms[roomName].addClient(client)
  91.         else:
  92.             self.rooms[roomName] = TransformiceRoomHandler(self, roomName)
  93.             self.rooms[roomName].addClient(client)
  94.         #return self.rooms[roomName]
  95.  
  96.     def closeRoom(self, room):
  97.         if self.rooms.has_key(room.name):
  98.             room.close()
  99.             del self.rooms[room.name]
  100.  
  101.     def getConnectedPlayerCount(self):
  102.         return 1
  103.  
  104.     def generatePlayerCode(self):
  105.         return random.randrange(1, 10000000)
  106.  
  107.     def recommendRoom(self):
  108.         return 1
  109.         #return min(self.rooms.itervalues(), key=lambda room: abs(len(room.clients) - 20)).name
  110.  
  111. class TransformiceStateRecorder(object):
  112.     def __init__(self, room):
  113.         self.room = room
  114.  
  115.         self.reset()
  116.  
  117.     def reset(self):
  118.         self.sateLog = []
  119.  
  120.         self.lastPhysicsStateEvent = None
  121.         self.anchors = []
  122.  
  123.     def log(self, eventTokens, values):
  124.         self.sateLog.append((eventTokens, values))
  125.     def logMessage(self, messageFunction, args):
  126.         self.sateLog.append((messageFunction, args))
  127.  
  128.     def setPhyscisState(self, eventTokens, values):
  129.         self.lastPhysicsStateEvent = (eventTokens, values)
  130.     def addAnchor(self, values):
  131.         self.anchors.extend(values)
  132.  
  133.     def sendToClient(self, client):
  134.         if self.lastPhysicsStateEvent:
  135.             eventTokens, value = self.lastPhysicsStateEvent
  136.             client.sendData(eventTokens, value)
  137.  
  138.         for sendThing, value in self.sateLog:
  139.             if type(sendThing) == types.FunctionType:
  140.                 sendThing(client, *value)
  141.             else:
  142.                 client.sendData(sendThing, value)
  143.  
  144.         if len(self.anchors) > 0:
  145.             client.sendSetAnchors(self.anchors)
  146.  
  147. class TransformiceRoomHandler(object):
  148.     def __init__(self, server, name):
  149.         self.server = server
  150.         self.name = name.strip()
  151.  
  152.         self.clients = {}
  153.  
  154.         self.stateRecorder = TransformiceStateRecorder(self)
  155.  
  156.         self.currentShamanCode = None
  157.         self.currentSyncroniserCode = None
  158.  
  159.         self.isSandbox = False
  160.         self.isBootcamp = False
  161.         self.specificMap = False
  162.         self.properNoShamanMaps = True
  163.  
  164.         #self.currentWorld = random.choice(LEVEL_LIST)
  165.         runthismap = random.choice(LEVEL_LIST)
  166.         if runthismap == 901:
  167.             runthismap = 1006
  168.         if runthismap == 902:
  169.             runthismap = 1007
  170.         if runthismap == 903:
  171.             runthismap = 1015
  172.         if runthismap == 904:
  173.             runthismap = 1027
  174.         if runthismap == 905:
  175.             runthismap = 1040
  176.         if runthismap == 906:
  177.             runthismap = 1062
  178.         if runthismap == 907:
  179.             runthismap = 1067
  180.         if runthismap == 908:
  181.             runthismap = 1087
  182.         if runthismap == 909:
  183.             runthismap = 1088
  184.         if runthismap == 910:
  185.             runthismap = 1092
  186.         self.currentWorld = runthismap
  187.  
  188.         if self.name.startswith("sandbox_") or self.name.startswith("play_") or self.name.startswith("bootcamp_"):
  189.             try:
  190.                 runthismap = int(re.search(r"([0-9]+)$", self.name).group(0))
  191.                 if runthismap == 901:
  192.                     runthismap = 11006
  193.                 if runthismap == 902:
  194.                     runthismap = 11007
  195.                 if runthismap == 903:
  196.                     runthismap = 11015
  197.                 if runthismap == 904:
  198.                     runthismap = 11027
  199.                 if runthismap == 905:
  200.                     runthismap = 11040
  201.                 if runthismap == 906:
  202.                     runthismap = 11062
  203.                 if runthismap == 907:
  204.                     runthismap = 11067
  205.                 if runthismap == 908:
  206.                     runthismap = 11087
  207.                 if runthismap == 909:
  208.                     runthismap = 11088
  209.                 if runthismap == 910:
  210.                     runthismap = 11092
  211.                 self.currentWorld = runthismap
  212.             except (ValueError, AttributeError):
  213.                 pass
  214.             else:
  215.                 self.specificMap = True
  216.  
  217.                 if self.name.startswith("sandbox_"):
  218.                     self.isSandbox = True
  219.                 if self.name.startswith("bootcamp_"):
  220.                     self.isBootcamp = True
  221.  
  222.         self.everybodyIsShaman = self.isSandbox
  223.         self.nobodyIsShaman = self.isBootcamp
  224.  
  225.  
  226.         self.worldChangeTimer = None
  227.         if not self.isSandbox:
  228.                 self.worldChangeTimer = threading.Timer(120, self.worldChange)
  229.                 self.worldChangeTimer.start()
  230.  
  231.         self.gameStartTime = time.time()
  232.         self.numCompleted = 0
  233.  
  234.     def close(self):
  235.         if self.worldChangeTimer:
  236.             self.worldChangeTimer.cancel()
  237.  
  238.  
  239.     def worldChange(self):
  240.  
  241.         self.stateRecorder.reset()
  242.         self.currentSyncroniserCode = None
  243.         if self.clients.has_key(self.currentShamanCode):
  244.             currentShaman = self.clients[self.currentShamanCode]
  245.             for playerCode, client in self.clients.iteritems():
  246.                 try: #be cautious, threads break things but we don't want it to die
  247.                     client.sendShamanPerformance(currentShaman.username, self.numCompleted)
  248.                 except:
  249.                     pass
  250.         self.currentShamanCode = None
  251.  
  252.         for playerCode, client in self.clients.iteritems():
  253.             client.resetPlay()
  254.  
  255.         if not self.specificMap:
  256.             runthismap = random.choice(LEVEL_LIST)
  257.             #if runthismap == 901:
  258.             #        runthismap = random.choice(LEVEL_LIST)
  259.             #if runthismap == 902:
  260.             #        runthismap = random.choice(LEVEL_LIST)
  261.             #if runthismap == 903:
  262.             #        runthismap = random.choice(LEVEL_LIST)
  263.             #if runthismap == 904:
  264.             #        runthismap = random.choice(LEVEL_LIST)
  265.             if runthismap == 901:
  266.                 runthismap = 1006
  267.             if runthismap == 902:
  268.                 runthismap = 1007
  269.             if runthismap == 903:
  270.                 runthismap = 1015
  271.             if runthismap == 904:
  272.                 runthismap = 1027
  273.             if runthismap == 905:
  274.                 runthismap = 1040
  275.             if runthismap == 906:
  276.                 runthismap = 1062
  277.             if runthismap == 907:
  278.                 runthismap = 1067
  279.             if runthismap == 908:
  280.                 runthismap = 1087
  281.             if runthismap == 909:
  282.                 runthismap = 1088
  283.             if runthismap == 910:
  284.                 runthismap = 1092
  285.             if runthismap == self.currentWorld:
  286.                     runthismap = random.choice(LEVEL_LIST)
  287.             self.currentWorld = runthismap
  288.         #print self.currentWorld, self.specificMap
  289.  
  290.         for playerCode, client in self.clients.iteritems():
  291.             client.startPlay()
  292.  
  293.         self.worldChangeTimer = threading.Timer(120, self.worldChange)
  294.         self.worldChangeTimer.start()
  295.  
  296.         self.gameStartTime = time.time()
  297.         self.numCompleted = 0
  298.  
  299.     def worldChangeSpecific(self, mapnumber):
  300.  
  301.         #self.stateRecorder.reset()
  302.         #self.currentSyncroniserCode = None
  303.  
  304.         #if self.clients.has_key(self.currentShamanCode):
  305.         #    currentShaman = self.clients[self.currentShamanCode]
  306.         #    for playerCode, client in self.clients.iteritems():
  307.         #        try: #be cautious, threads break things but we don't want it to die
  308.         #            client.sendShamanPerformance(currentShaman.username, self.numCompleted)
  309.         #        except:
  310.         #            pass
  311.         #self.currentShamanCode = None
  312.  
  313.         #for playerCode, client in self.clients.iteritems():
  314.         #    client.resetPlay()
  315.  
  316.         #if not self.specificMap:
  317.         self.currentWorld = mapnumber
  318.         #print self.currentWorld, self.specificMap
  319.  
  320.         for playerCode, client in self.clients.iteritems():
  321.             client.startPlay()
  322.  
  323.         #self.worldChangeTimer = threading.Timer(120, self.worldChange)
  324.         #self.worldChangeTimer.start()
  325.  
  326.         #self.gameStartTime = time.time()
  327.         #self.numCompleted = 0
  328.  
  329.  
  330.     def checkShouldChangeWorld(self):
  331.         if not self.isSandbox:
  332.             if all(client.isDead for client in self.clients.itervalues()):
  333.                 self.worldChangeTimer.cancel()
  334.                 self.worldChange()
  335.  
  336.     def resetSandbox(self):
  337.         if self.isSandbox:
  338.             for playerCode, client in self.clients.iteritems():
  339.                 resetpscore=0
  340.                 self.informAll(TransformiceClientHandler.sendPlayerDied, [playerCode, resetpscore])
  341.                 client.isDead=True
  342.             if all(client.isDead for client in self.clients.itervalues()):
  343.                 #self.worldChangeTimer.cancel()
  344.                 #self.worldChange()
  345.                 for playerCode, client in self.clients.iteritems():
  346.                     client.resetPlay()
  347.                 self.currentWorld = self.currentWorld
  348.                 for playerCode, client in self.clients.iteritems():
  349.                     client.startPlay()
  350.         else:
  351.             pass
  352.  
  353.     def addClient(self, newClient):
  354.  
  355.         self.clients[newClient.playerCode] = newClient
  356.  
  357.         self.informAllOthers(newClient, TransformiceClientHandler.sendNewPlayer, [newClient.getPlayerData()])
  358.  
  359.         #h
  360.         newClient.room = self
  361.  
  362.         newClient.startPlay()
  363.         self.stateRecorder.sendToClient(newClient)
  364.  
  365.     def removeClient(self, removeClient):
  366.         if self.clients.has_key(removeClient.playerCode):
  367.             del self.clients[removeClient.playerCode]
  368.  
  369.             if self.getPlayerCount() == 0:
  370.                 self.server.closeRoom(self)
  371.                 return
  372.  
  373.             self.informAll(TransformiceClientHandler.sendPlayerDisconnect, [removeClient.playerCode])
  374.             if self.currentSyncroniserCode == removeClient.playerCode:
  375.                 newSyncroniser = random.choice(self.clients.values())
  376.                 newSyncroniser.isSyncroniser = True
  377.  
  378.                 self.currentSyncroniserCode = newSyncroniser.playerCode
  379.                 self.informAll(TransformiceClientHandler.sendSynchroniser, [newSyncroniser.playerCode])
  380.  
  381.         self.checkShouldChangeWorld()
  382.  
  383.     def playMusic(self, path):
  384.         self.informAll(TransformiceClientHandler.sendPlayMusic, [path])
  385.  
  386.     def informAll(self, clientFunction, args):
  387.         for playerCode, client in self.clients.iteritems():
  388.             clientFunction(client, *args)
  389.  
  390.     def informAllOthers(self, senderClient, clientFunction, args):
  391.         for playerCode, client in self.clients.iteritems():
  392.             if playerCode != senderClient.playerCode:
  393.                 clientFunction(client, *args)
  394.  
  395.     def sendAll(self, eventTokens, data = None):
  396.         for playerCode, client in self.clients.iteritems():
  397.             client.sendData(eventTokens, data)
  398.     def sendAllOthers(self, senderClient, eventTokens, data):
  399.         for playerCode, client in self.clients.iteritems():
  400.             if client.playerCode != senderClient.playerCode:
  401.                 client.sendData(eventTokens, data)
  402.  
  403.     def killAll(self):
  404.         for playerCode, client in self.clients.iteritems():
  405.             resetpscore=0
  406.             self.informAll(TransformiceClientHandler.sendPlayerDied, [playerCode, resetpscore])
  407.             client.isDead=True
  408.         self.checkShouldChangeWorld()
  409.  
  410.     def getPlayerCount(self):
  411.         return len(self.clients)
  412.  
  413.     def getPlayerList(self):
  414.         for playerCode, client in self.clients.iteritems():
  415.             yield client.getPlayerData()
  416.  
  417.     def getShamanCode(self):
  418.         if self.currentShamanCode is None:
  419.             self.currentShamanCode = random.choice(self.clients.keys())
  420.         return self.currentShamanCode
  421.     def getSyncroniserCode(self):
  422.         if self.currentSyncroniserCode is None:
  423.             self.currentSyncroniserCode = random.choice(self.clients.keys())
  424.         return self.currentSyncroniserCode
  425.  
  426. class TransformiceClientHandler(asynchat.async_chat):
  427.     def __init__(self, server, sock, address):
  428.         self.server = server
  429.         self.address = address
  430.  
  431.         asynchat.async_chat.__init__(self, sock=sock)
  432.         self.buffer = ""
  433.         self.set_terminator("\x00")
  434.         self.validatingVersion = True
  435.  
  436.  
  437.         self.username = ""
  438.         self.playerCode = -1
  439.         self.privilegeLevel = 0
  440.             #0 - "Invite" - Guest?
  441.             #1 - Normal player
  442.             #5 - "Modo"?
  443.             #10 - Admin
  444.         self.room = None
  445.  
  446.         self.isShaman = False
  447.         self.isDead = False
  448.         self.isSyncroniser = False
  449.         self.score = 0
  450.  
  451.         self.titleNumber = 0
  452.  
  453.         self.Tellfirsttime = 0
  454.  
  455.  
  456.  
  457.     def collect_incoming_data(self, data):
  458.         self.buffer += data
  459.  
  460.     def found_terminator(self):
  461.         if self.validatingVersion:
  462.             if self.buffer == "<policy-file-request/>":
  463.                 if VERBOSE:
  464.                     logging.debug("Policy file request")
  465.                 self.push(r"""<?xml version="1.0"?>
  466.                                <cross-domain-policy>
  467.                                    <allow-access-from domain="*" to-ports="%d"/>
  468.                                </cross-domain-policy>""" % (self.server.PORT) + "\x00")
  469.                 self.close_when_done()
  470.  
  471.             else:
  472.                 version, bytesLoaded1, bytesLoaded2 = self.buffer.split("\x01")
  473.                 if version == VERSION:
  474.                     self.sendCorrectVersion()
  475.                 else:
  476.                     self.close_when_done()
  477.                 self.validatingVersion = False
  478.         else:
  479.             self.parseData(self.buffer)
  480.  
  481.         self.buffer = ""
  482.  
  483.  
  484.     def parseData(self, data):
  485.         MDT_stuff = data[:4]
  486.         data = data[4:]
  487.  
  488.         values = data.split("\x01")
  489.  
  490.         if VERBOSE:
  491.             pass
  492.             #logging.debug(repr(MDT_stuff), values)
  493.  
  494.         eventTokens = values.pop(0)
  495.         eventToken1, eventToken2 = eventTokens
  496.  
  497.         if eventToken1 == "\x1A":
  498.             if eventToken2 == "\x02":
  499.                 #awake timer
  500.                 unknownTime, = values
  501.                 unknownTime = int(unknownTime)
  502.  
  503.             elif eventToken2 == "\x03":
  504.                 #create account
  505.                 username, passwordHash = values
  506.  
  507.                 username = username.replace("<","")
  508.  
  509.                 self.server.createAccount(username, passwordHash)
  510.                 self.login(username, passwordHash)
  511.  
  512.             elif eventToken2 == "\x04":
  513.                 #login
  514.                 username, passwordHash, showTarget = values
  515.                 showTarget = bool(int(showTarget))
  516.  
  517.                 username = username.replace("<","")
  518.  
  519.                 self.login(username, passwordHash)
  520.  
  521.             else:
  522.                 logging.warning("Unimplemented %r" % eventTokens)
  523.                 #raise NotImplementedError, eventTokens
  524.         elif eventToken1 == "\x04":
  525.             if eventToken2 == "\x03":
  526.                 #world physics update
  527.                 #CodePartieEnCours = values.pop(0)
  528.                 #for objectData in values:
  529.                 #    if objectData == 'x':
  530.                 #        continue
  531.                 #    objectType, x, y, dx, dy, rotation, angularVelocity, isSolid = objectData.split(',')
  532.  
  533.                 if self.isSyncroniser:
  534.                     self.room.sendAllOthers(self, eventTokens, values)
  535.                     self.room.stateRecorder.setPhyscisState(eventTokens, values)
  536.  
  537.             elif eventToken2 == "\x04":
  538.                 #position update
  539.                 #isMovingRight, isMovingLeft, x, y, dx, dy, isJumping, jumpAnimation = values
  540.  
  541.                 self.room.sendAllOthers(self, eventTokens, values + [self.playerCode])
  542.  
  543.  
  544.  
  545.             elif eventToken2 == "\x05":
  546.                 #player went out of bounds
  547.                 self.isDead = True
  548.  
  549.                 #score shit
  550.                 #self.score = self.score-1
  551.                 #if self.score < 0:
  552.                 #    self.score = 0
  553.                 #end
  554.  
  555.                 self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  556.  
  557.                 self.room.checkShouldChangeWorld()
  558.             elif eventToken2 == "\x06":
  559.                 # "Demande_Giclage"
  560.                 #objectCode, = values
  561.  
  562.                 self.room.sendAll(eventTokens, values)
  563.  
  564.  
  565.             elif eventToken2 == "\x08":
  566.                 #animation conjouring?
  567.                 #direction, = values
  568.                 #direction = int(direction)
  569.  
  570.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode] + values)
  571.  
  572.             elif eventToken2 == "\x09":
  573.                 #begin/end crouch
  574.                 crouching, = values
  575.                 crouching = bool(int(crouching))
  576.                 if crouching:
  577.                     self.room.sendAllOthers(self, eventTokens, [self.playerCode] + values)
  578.                 else:
  579.                     self.room.sendAllOthers(self, eventTokens, [self.playerCode])
  580.             elif eventToken2 == "\x12":
  581.                 #begin grappin
  582.                 x, y = values
  583.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode] + values)
  584.                 #pass
  585.             elif eventToken2 == "\x13":
  586.                 #end grappin
  587.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode])
  588.                 #pass
  589.  
  590.             elif eventToken2 == "\x14":
  591.                 logging.debug("PONG'd")
  592.  
  593.             else:
  594.                 logging.warning("Unimplemented %r" % eventTokens)
  595.                 #raise NotImplementedError, eventTokens
  596.         elif eventToken1 == "\x06":
  597.             if eventToken2 == "\x06":
  598.                 #sent chat message
  599.                 message, = values
  600.  
  601.                 message = message.replace("<","")
  602.                 #message = message.replace("#","")
  603.  
  604.                 logging.info("(%s) %s: %r" % (self.room.name, self.username, message))
  605.  
  606.                 self.room.sendAll(eventTokens, [self.playerCode, self.username, message.strip()])
  607.             elif eventToken2 == "\x1A":
  608.                 #sent command
  609.  
  610.                 event, = values
  611.                 event_raw = event.strip()
  612.                 event = event_raw.lower()
  613.  
  614.                 logging.info("(%s) [c] %s: %r" % (self.room.name, self.username, event))
  615.  
  616.                 if event.startswith("room ") or event.startswith("salon "):
  617.                     #changing room
  618.                     #roomname = event[5:]
  619.                     roomname = event.split(" ", 1)[1]                  
  620.                     self.enterRoom(roomname)
  621.                    
  622.                 elif event.startswith("c ") or event.startswith("w "):
  623.                     _, username, message = event_raw.split(" ", 2)
  624.  
  625.                     if not self.server.sendPrivMsg(self.username, username, message): #if failure
  626.                         self.sendPlayerNotFound()
  627.                     else:
  628.                         self.sendSentPrivMsg(username, message)    
  629.                        
  630.                 elif event in ("dance", "danse", "profil"):
  631.                     self.room.informAll(TransformiceClientHandler.sendPlayerAction, [self.playerCode, 1])
  632.                 elif event in ("laugh", "rire"):
  633.                     self.room.informAll(TransformiceClientHandler.sendPlayerAction, [self.playerCode, 2])
  634.                 elif event in ("cry", "pleurer"):
  635.                     self.room.informAll(TransformiceClientHandler.sendPlayerAction, [self.playerCode, 3])
  636.                 elif event in ("deconnecter"):
  637.                     self.room.informAll(TransformiceClientHandler.sendPlayerDisconnect, [self.playerCode])
  638.                     self.close()
  639.                 elif event in ("kill", "sucide", "bubbles", "die"):
  640.                     self.isDead = True
  641.                     self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  642.                     self.room.checkShouldChangeWorld()
  643.                
  644.                    
  645.                 elif event.startswith("title ") or event.startswith("titre "):
  646.                     titlenumber = event.split(" ", 1)[1]
  647.                     self.titleNumber = titlenumber
  648.                    
  649.                 elif event.startswith("profil"):
  650.                         self.sendPlayerNotFound()
  651.                    
  652.                 elif event.startswith("ban "):
  653.                     banname = event.split(" ", 1)[1]
  654.                     #Not done
  655.  
  656.                 elif event.startswith("annonce ") or event.startswith("an "):
  657.                     #modsendmessage = event.split(" ", 1)[1]
  658.                     if self.username=="Admin":
  659.                         modsendmessage = event.split(" ", 1)[1]
  660.                          #for room in self.server.rooms.itervalues():
  661.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Admin", modsendmessage])
  662.                        
  663.                 elif event.startswith("information") or event.startswith("info "):
  664.                     #modsendmessage = event.split(" ", 1)[1]
  665.                     if self.username=="Admin":
  666.                         modsendmessage = event.split(" ", 1)[1]
  667.                          #for room in self.server.rooms.itervalues():
  668.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  669.                        
  670.                 elif event.startswith("all") or event.startswith("tous "):
  671.                     #modsendmessage = event.split(" ", 1)[1]
  672.                     if self.username=="Admin":
  673.                         modsendmessage = event.split(" ", 1)[1]
  674.                          #for room in self.server.rooms.itervalues():
  675.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["", modsendmessage])                    
  676.                        
  677.                 elif event.startswith("def"):
  678.                     if self.username=="Admin":
  679.                         tellfirstm = event.split(" ", 1)[1]
  680.                         if tellfirstm == "arret":
  681.                             modsendmessage = "Arret du serveur"
  682.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  683.                         elif tellfirstm == "infos":
  684.                             modsendmessage = "TransforEmu V 0.55 By Phoenix ~For FUNKYCHEAT.FR~"
  685.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  686.                         elif tellfirstm == "aide":
  687.                             modsendmessage = "Liste des commandes dans le site. Pour obtenir de l'aide de la part d'un administrateur '/c Admin TONMESSAGE"
  688.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  689.                         elif tellfirstm == "maj":
  690.                             modsendmessage = "Relancez la page et videz le cache"
  691.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Mise A Jour", modsendmessage])
  692.                         elif tellfirstm == "reboot":
  693.                             modsendmessage = "Reboot (Redemmarage) du serveur imminent"
  694.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  695.                         elif tellfirstm == "commandes":
  696.                             modsendmessage = "<b><u>Commandes</u></b> Joueurs Normaux</br></br> <b><u>Touche ALT + Clic sur la carte</u></b> Teleportation</br></br></br> <b><u>Clic sur la carte</u></b> Active/Bouge le Grappin</br> <b><u>Clic sur soi</u></b> Desactive le Grappin</br> <b><u>/salon X</u></b> Change de salon</br> <b><u>/salon sandbox_X</u></b> Va dans un salon Sandbox (Pas de limite de temps, tout le monde chaman) (X = ID de carte) </br><b><u>/salon play_X</u></b> Va dans un salon ou une carte sera joue en boucle (X = ID de carte)</br> <b><u>/salon bootcamp_X</u></b> Va dans un salon sans chaman (X = ID de carte)</br> <b><u>/rire</u></b> Rigoler</br> <b><u>/pleurer</u></b> Pleurer</br> <b><u>/danse</u></b> Danser</br> <b><u>/deconnecter</u></b> Se deconnecter</br> <b><u>/sucide</u></b> Se tuer (de la partie)</br> <b><u>/titre X</u></b> Change de titre</br> <b><u>/c X Y</u></b> Parler a quelqun (X = Destinataire, Y = Message)"
  697.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  698.                            
  699.                 elif event.startswith("first ") or event.startswith("premier "):
  700.                     if self.username=="Admin":
  701.                         tellfirstm = event.split(" ", 1)[1]
  702.                         if tellfirstm == "oui":
  703.                             modsendmessage = "Publication des first dans le chat"
  704.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  705.                             self.Tellfirsttime=1
  706.                         elif tellfirstm == "non":
  707.                             modsendmessage = "Arret de la publication des first dans le chat"
  708.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  709.                             self.Tellfirsttime=0
  710.                         else:
  711.                             modsendmessage = "Invalide."
  712.                             self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Erreur", modsendmessage])
  713.                             self.Tellfirsttime=0
  714.  
  715.                 elif event.startswith("map ") or event.startswith("carte "):
  716.                     #This command is very glitchy. Avoid using.
  717.                     if self.username=="Admin":
  718.                         mapnumber = event.split(" ", 1)[1]
  719.                         self.isDead = True
  720.                         self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  721.                         self.room.worldChangeSpecific(mapnumber)
  722.                         modsendmessage = "Changement de carte"
  723.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  724.                        
  725.                    
  726.                        
  727.                        
  728.                        
  729.                 elif event.startswith("chamanfake ") or event.startswith("fake "):
  730.                     if self.username=="Admin":
  731.                         _, hname, hsaves = event_raw.split(" ", 2)
  732.                         self.room.informAll(TransformiceClientHandler.sendShamanPerformance, [hname, hsaves])
  733.  
  734.                 elif event in ("killall") or event.startswith("tuercarte"):
  735.                     if self.username=="Admin":
  736.                         self.room.killAll()
  737.                         modsendmessage = "Joueurs de la carte tues"
  738.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  739.                    
  740.                 elif event in ("clear") or event.startswith("nettoyer"):
  741.                     if self.username=="Admin":
  742.                         self.room.resetSandbox()
  743.                         modsendmessage = "Relancement de la carte"
  744.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  745.                        
  746.                 elif event in ("online") or event.startswith("joueursco"):
  747.                     #modsendmessage = event.split(" ", 1)[1]
  748.                     if self.username=="Admin":
  749.                         #modsendmessage = self.room.getPlayerCount()
  750.                         playercountm = self.room.getPlayerCount()
  751.                         modsendmessage = 'Il y a %d Joueurs Connéctés.' % playercountm
  752.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  753.  
  754.                 elif event in ("mapid") or event.startswith("idcarte"):
  755.                     #modsendmessage = event.split(" ", 1)[1]
  756.                     if self.username=="Admin":
  757.                         currentmapme = self.room.currentWorld
  758.                         modsendmessage = 'Nous sommes sur la carte %d.' % currentmapme
  759.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  760.  
  761.                 elif event in ("cartere") or event.startswith("replay"):
  762.                     #modsendmessage = event.split(" ", 1)[1]
  763.                     if self.username=="Admin":
  764.                         currentmapme = self.room.currentWorld
  765.                         self.isDead = True
  766.                         self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  767.                         self.room.worldChangeSpecific(currentmapme)                
  768.                         modsendmessage = 'Relancement de la carte %d.' % currentmapme
  769.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Information", modsendmessage])
  770.                        
  771.                 elif event.startswith("hole ") or event.startswith("troufake "):
  772.                     if self.username=="Admin":
  773.                         _, hscore, hplace, htime = event_raw.split(" ", 3)
  774.                         self.isDead = True
  775.                         #self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  776.                         self.room.informAll(TransformiceClientHandler.sendPlayerGotCheese, [self.playerCode, hscore, hplace, htime])
  777.                         self.room.checkShouldChangeWorld()
  778.  
  779.                 elif event.startswith("libre ") or event.startswith("free "):
  780.                     if self.username=="Admin":
  781.                         _, hscore, htime = event_raw.split(" ", 2)
  782.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["", ])                      
  783.            
  784.                        
  785.                 elif event.startswith("music ") or event.startswith("musique"):
  786.                     if self.username=="Admin":
  787.                         musicmessage = event.split(" ", 1)[1]
  788.                         self.room.informAll(TransformiceClientHandler.sendPlayMusic, [musicmessage])
  789.                         modsendmessage = "On met le son !!!"
  790.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Musique", modsendmessage])
  791.                        
  792.                 elif event.startswith("musicoff") or event.startswith("musiqueoff"):
  793.                     if self.username=="Admin":
  794.                         musicmessage = event.split("off", 1)[1]
  795.                         self.room.informAll(TransformiceClientHandler.sendPlayMusic, [musicmessage])
  796.                         modsendmessage = "Et on coupe le son !!!"
  797.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~Musique", modsendmessage])                    
  798.                        
  799.                 else:
  800.                     logging.warning("Unimplemented %r" % event)
  801.                     #raise NotImplementedError, event
  802.  
  803.             else:
  804.                 logging.warning("Unimplemented %r" % eventTokens)
  805.                 #raise NotImplementedError, eventTokens
  806.         elif eventToken1 == "\x05":
  807.             if eventToken2 == "\x07":
  808.                 #Anchor thing
  809.                 #jointType, object1, o1x, o1y, o1r, object2, o2x, o2y, o2r = values
  810.  
  811.                 self.room.stateRecorder.addAnchor(values)
  812.                 self.room.sendAllOthers(self, eventTokens, values)
  813.                 #self.room.sendAll(eventTokens, values)
  814.  
  815.             elif eventToken2 == "\x08":
  816.                 #object begin conjouring
  817.                 #objectCode, x, y, rotation = values
  818.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode] + values)
  819.  
  820.             elif eventToken2 == "\x09":
  821.                 #end conjouring?
  822.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode])
  823.  
  824.             elif eventToken2 == "\x0E":
  825.                 # "Demande_Creation_Clou"
  826.                 #pass
  827.  
  828.                 self.room.sendAll(eventTokens, values)
  829.  
  830.             elif eventToken2 == "\x0F":
  831.                 # "Demande_Creation_Sol"
  832.                 #pass
  833.  
  834.                 self.room.sendAll(eventTokens, values)
  835.  
  836.             elif eventToken2 == "\x10":
  837.                 # "Demande_Deplacement_Fromage"
  838.                 #x, y = values
  839.  
  840.                 self.room.sendAll(eventTokens, values)
  841.  
  842.             elif eventToken2 == "\x11":
  843.                 # "Demande_Explosion"
  844.                 #pass
  845.  
  846.                 self.room.sendAll(eventTokens, values)
  847.  
  848.             elif eventToken2 == "\x12":
  849.                 #Mouse got cheese into hole!
  850.                 objectID, = values
  851.  
  852.                 self.isDead = True
  853.  
  854.                 self.room.numCompleted += 1
  855.                 place = self.room.numCompleted
  856.  
  857.                 timeTaken = int( (time.time() - self.room.gameStartTime)*10 )
  858.  
  859.                 #Score shit
  860.                 playerscorep = self.score
  861.                 if place==1:
  862.                     playerscorep = playerscorep+16
  863.                 elif place==2:
  864.                     playerscorep = playerscorep+14
  865.                 elif place==3:
  866.                     playerscorep = playerscorep+12
  867.                 else:
  868.                     playerscorep = playerscorep+10
  869.                 if self.isShaman==True:
  870.                     playerscorep = 0
  871.                 self.score = playerscorep
  872.                 #end
  873.  
  874.                 if self.room.numCompleted==1:
  875.                     if self.Tellfirsttime == 1:
  876.                         modsendmessage = 'First en %d dixiemes de secondes' % (timeTaken)
  877.                         self.room.informAll(TransformiceClientHandler.sendModMessage, ["~First", modsendmessage])
  878.  
  879.                 self.room.informAll(TransformiceClientHandler.sendPlayerGotCheese, [self.playerCode, self.score, place, timeTaken])
  880.  
  881.                 #h
  882.                 self.room.stateRecorder.logMessage(TransformiceClientHandler.sendPlayerGotCheese,  [self.playerCode, self.score, place, timeTaken])
  883.  
  884.                 self.room.checkShouldChangeWorld()
  885.  
  886.             elif eventToken2 == "\x13":
  887.                 #client thinks he has cheese
  888.                 #pass
  889.  
  890.                 #sendAll will confirm it to the client :/
  891.                 self.room.sendAll(eventTokens, [self.playerCode])
  892.  
  893.                 self.room.stateRecorder.log(eventTokens, [self.playerCode])
  894.  
  895.             elif eventToken2 == "\x14":
  896.                 #object finalise conjouring
  897.                 #objectCode, x, y, rotation, unkn1, unkn2, isSolid = values
  898.  
  899.                 self.room.sendAllOthers(self, eventTokens, [self.playerCode] + values)
  900.  
  901.  
  902.             elif eventToken2 == "\x15":
  903.                 # "Creation_Objet_Monde" - world object creation
  904.                 #objectCode, x, y, unkn1, unkn2, unkn3, unkn4 = values
  905.  
  906.                 #if self.isSyncroniser:
  907.                 self.room.sendAllOthers(self, eventToken1 + "\x14", values)
  908.             elif eventToken2 == "\x16":
  909.                 # "Demande_Changement_Gravite"
  910.                 #gx, gy = values
  911.  
  912.                 #if self.isSyncroniser:
  913.                 self.room.sendAll(eventTokens, values)
  914.  
  915.             else:
  916.                 logging.warning("Unimplemented %r" % eventTokens)
  917.                 #raise NotImplementedError, eventTokens
  918.         elif eventToken1 == "\x14":
  919.             if eventToken2 == "\x14":
  920.                 #open shop
  921.  
  922.                 #do something here
  923.                 pass
  924.         elif eventToken1 == "\x18":
  925.             if eventToken2 == "\x0F":
  926.                 #open forums
  927.  
  928.                 #do something here
  929.                 pass
  930.             else:
  931.                 logging.warning("Unimplemented %r" % eventTokens)
  932.                 #raise NotImplementedError, eventTokens
  933.         elif eventToken1 == "\x08":
  934.             if eventToken2 == "\x0D":
  935.                 #open friends
  936.                 pass
  937.             elif eventToken2 == "\x10":
  938.                 #attach baloon to player
  939.                 #playerCode, = values
  940.                 self.room.sendAll(eventTokens, values)
  941.             elif eventToken2 == "\x11":
  942.                 #baloon detatched
  943.                 self.room.sendAllOthers(self, "\x08\x10", [self.playerCode, "0"]) #unknown??
  944.             else:
  945.                 logging.warning("Unimplemented %r" % eventTokens)
  946.                 #raise NotImplementedError, eventTokens
  947.         elif eventToken1 == "\x19":
  948.             if eventToken2 == "\x03":
  949.                 #Clear drawing
  950.                 self.room.sendAllOthers(self, eventTokens, values)
  951.             elif eventToken2 == "\x04":
  952.                 #Start drawing
  953.                 #x,y = values
  954.                 self.room.sendAllOthers(self, eventTokens, values)
  955.             elif eventToken2 == "\x05":
  956.                 #Draw point
  957.                 #x,y = values
  958.                 self.room.sendAllOthers(self, eventTokens, values)
  959.             else:
  960.                 logging.warning("Unimplemented %r" % eventTokens)
  961.         else:
  962.             logging.warning("Unimplemented %r" % eventTokens)
  963.             #raise NotImplementedError, eventTokens
  964.  
  965.  
  966.     def handle_close(self):
  967.         if self.room:
  968.             self.room.removeClient(self)
  969.         self.close()
  970.  
  971.  
  972.     def getLook(self):
  973.         return "0,0"
  974.  
  975.     def sendData(self, eventCodes, data = None):
  976.         if VERBOSE:
  977.             logging.debug("Send %r %r" % (eventCodes, data))
  978.  
  979.         if data:
  980.             self.push('\x01'.join(map(str, [eventCodes] + data)) + "\x00")
  981.         else:
  982.             self.push(eventCodes + "\x00")
  983.  
  984.     def sendCorrectVersion(self):
  985.         self.sendData("\x1A" + "\x1B",
  986.             [str(self.server.getConnectedPlayerCount()), "0123456789", "0"] #MDT, CMDTEC
  987.         )
  988.  
  989.     def sendTitleList(self):
  990.         self.sendData("\x08" + "\x0F",
  991.             ["0"]
  992.         )
  993.  
  994.     def sendPlayerLoginData(self):
  995.         self.sendData("\x1A" + "\x08",
  996.             [self.username, str(self.playerCode), str(self.privilegeLevel)]
  997.         )
  998.  
  999.     def sendEnterRoom(self, roomName):
  1000.         self.sendData("\x05" + "\x15",
  1001.             [str(roomName)]
  1002.         )
  1003.                        
  1004.     def sendNewParty(self):
  1005.         self.sendData("\x05" + "\x05",
  1006.             [self.room.currentWorld, self.room.getPlayerCount(), 1] #time remaining?
  1007.         )
  1008.     def sendPlayerList(self):
  1009.         self.sendData("\x08" + "\x09",
  1010.             list(self.room.getPlayerList())
  1011.         )
  1012.  
  1013.     def sendNewPlayer(self, playerData):
  1014.         self.sendData("\x08" + "\x08",
  1015.             [playerData]
  1016.         )
  1017.  
  1018.     def sendPlayerDisconnect(self, playerCode):
  1019.         self.sendData("\x08" + "\x07",
  1020.             [playerCode]
  1021.         )
  1022.     def sendPlayerDied(self, playerCode, score):
  1023.         score = score-1
  1024.         if score < 0:
  1025.             score = 0
  1026.         self.score=score
  1027.         self.sendData("\x08" + "\x05",
  1028.             [playerCode, 0, score] # unkn (num left?), score
  1029.         )
  1030.     def sendPlayerGotCheese(self, playerCode, score, place, timeTaken):
  1031.         self.sendData("\x08" + "\x06",
  1032.             [playerCode, 0, score, place, timeTaken] #unkn (num left?), score, place, time
  1033.         )
  1034.  
  1035.     def sendShamanCode(self, shamanPlayerCode):
  1036.         self.sendData("\x08" + "\x14",
  1037.             [shamanPlayerCode]
  1038.         )
  1039.     def sendSynchroniser(self, playerCode):
  1040.         self.sendData("\x08" + "\x15",
  1041.             [playerCode]
  1042.         )
  1043.  
  1044.     def sendSetAnchors(self, anchors):
  1045.         self.sendData("\x05" + "\x07",
  1046.             anchors
  1047.         )
  1048.  
  1049.     def sendATEC(self):
  1050.         self.sendData("\x1A" + "\x1A")
  1051.     def sendPING(self):
  1052.         self.sendData("\x04" + "\x14")
  1053.  
  1054.     def sendShamanPerformance(self, shamanName, numGathered):
  1055.         #Will display "Info_Fromage_Chamane" in chat
  1056.         #   - "Merci a <V>%1<BL>, qui nous a fait gagner %2 fromages !"
  1057.         self.sendData("\x08" + "\x11",
  1058.             [shamanName, numGathered]
  1059.         )
  1060.  
  1061.     def sendPlayerAction(self, playerCode, action):
  1062.         self.sendData("\x08" + "\x16",
  1063.             [playerCode, action]
  1064.         )
  1065.  
  1066.     def sendModMessage(self, name, message):
  1067.         self.sendData("\x1A" + "\x05",
  1068.             [name, message]
  1069.         )
  1070.     def sendServerMessage(self, message):
  1071.         self.room.sendWholeServer(self, "\x1A\x04", ["[~Message serveur] ", message])
  1072.        
  1073.        
  1074.        
  1075.     def sendPlayMusic(self, path):
  1076.         self.sendData("\x1A" + "\x0C",
  1077.             [path]
  1078.         )
  1079.  
  1080.  
  1081.     def sendSentPrivMsg(self, username, message):
  1082.         self.sendData("\x06" + "\x07",
  1083.             [message, username]
  1084.         )
  1085.     def sendRecievePrivMsg(self, username, message):
  1086.         self.sendData("\x06" + "\x07",
  1087.             [message, username, "x"]
  1088.         )
  1089.     def sendPlayerNotFound(self):
  1090.         self.sendData("\x06" + "\x07")
  1091.  
  1092.  
  1093.     def getPlayerData(self):
  1094.         return '#'.join(map(str,
  1095.                                                                         #has cheese           #avatar?
  1096.             [self.username, self.playerCode, int(self.isDead), self.score, 0, self.titleNumber, 0, self.getLook()]
  1097.         ))
  1098.  
  1099.     def enterRoom(self, roomName):
  1100.  
  1101.         if self.room:
  1102.             self.room.removeClient(self)
  1103.  
  1104.         self.resetPlay()
  1105.         self.score = 0
  1106.  
  1107.         self.sendEnterRoom(roomName)
  1108.  
  1109.         #self.room =
  1110.         self.server.addClientToRoom(self, roomName)
  1111.  
  1112.  
  1113.     def resetPlay(self):
  1114.         self.isShaman = False
  1115.         self.isDead = False
  1116.         self.isSyncroniser = False
  1117.  
  1118.     def startPlay(self):
  1119.         self.resetPlay()
  1120.  
  1121.         self.sendNewParty()
  1122.         self.sendPlayerList()
  1123.  
  1124.         shamanCode = self.room.getShamanCode()
  1125.         if self.room.everybodyIsShaman:
  1126.             self.sendShamanCode(self.playerCode)
  1127.         elif self.room.nobodyIsShaman:
  1128.             self.sendShamanCode(0)
  1129.         elif self.room.properNoShamanMaps:
  1130.             if self.room.currentWorld==7:
  1131.                 self.sendShamanCode(0)
  1132.             elif self.room.currentWorld==8:
  1133.                 self.sendShamanCode(0)
  1134.             elif self.room.currentWorld==54:
  1135.                 self.sendShamanCode(0)
  1136.             elif self.room.currentWorld==55:
  1137.                 self.sendShamanCode(0)
  1138.             elif self.room.currentWorld==57:
  1139.                 self.sendShamanCode(0)
  1140.             elif self.room.currentWorld==70:
  1141.                 self.sendShamanCode(0)
  1142.             elif self.room.currentWorld==77:
  1143.                 self.sendShamanCode(0)
  1144.             elif self.room.currentWorld==78:
  1145.                 self.sendShamanCode(0)
  1146.             elif self.room.currentWorld==87:
  1147.                 self.sendShamanCode(0)
  1148.             elif self.room.currentWorld==88:
  1149.                 self.sendShamanCode(0)
  1150.             elif self.room.currentWorld==89:
  1151.                 self.sendShamanCode(0)
  1152.             elif self.room.currentWorld==92:
  1153.                 self.sendShamanCode(0)
  1154.             elif self.room.currentWorld==99:
  1155.                 self.sendShamanCode(0)
  1156.             elif self.room.currentWorld==1007:
  1157.                 self.sendShamanCode(0)
  1158.             else:
  1159.                 self.sendShamanCode(shamanCode)
  1160.         else:
  1161.             self.sendShamanCode(shamanCode)
  1162.  
  1163.         if shamanCode == self.playerCode:
  1164.             self.isShaman = True
  1165.  
  1166.         syncroniserCode = self.room.getSyncroniserCode()
  1167.         self.sendSynchroniser(syncroniserCode)
  1168.         if syncroniserCode == self.playerCode:
  1169.             self.isSyncroniser = True
  1170.         if self.username == "Timekeeper":
  1171.             self.isDead = True
  1172.             self.room.informAll(TransformiceClientHandler.sendPlayerDied, [self.playerCode, self.score])
  1173.  
  1174.  
  1175.  
  1176.     def login(self, username, passwordHash):
  1177.  
  1178.         if username == "":
  1179.             username = "Souris"
  1180.  
  1181.         if username == "Nickname":
  1182.             username = "Souris"                        
  1183.            
  1184.         if username == "Yellow":
  1185.             username = "[~Yellow~]"
  1186.            
  1187.         if username == "Melibellule":
  1188.             username = "[~Melibellule~]"               
  1189.  
  1190.         if username == "Tigrounette":
  1191.             username = "[~Tigrounette~]"
  1192.            
  1193.         if username == "Modogeek":
  1194.             username = "[~Modogeek~]"  
  1195.            
  1196.         if username == "Jonathan":
  1197.             username = "[~Jonathan~]"              
  1198.  
  1199.         if username == "Tigrounette":
  1200.             username = "[~Tigrounette~]"           
  1201.                            
  1202.         logging.info("Authenticate %s - %s %s" % (self.address, username, passwordHash))
  1203.  
  1204.         priv = self.server.authenticate(username, passwordHash)
  1205.         if priv == -1:
  1206.             #return False
  1207.             self.close()
  1208.  
  1209.         else:
  1210.             self.username = username
  1211.  
  1212.             self.playerCode = self.server.generatePlayerCode()
  1213.             self.privilegeLevel = priv
  1214.             #self.titleNumber = 0
  1215.             if self.username == "Phoenix":
  1216.                 self.titleNumber = 440
  1217.             elif self.username == "Admin":
  1218.                 self.titleNumber = 440
  1219.             elif self.username == "Yellow":
  1220.                 self.titleNumber = 444
  1221.             else:
  1222.                 self.titleNumber = 102
  1223.  
  1224.  
  1225.             self.sendTitleList()
  1226.             self.sendPlayerLoginData()
  1227.  
  1228.             self.enterRoom(self.server.recommendRoom())
  1229.  
  1230.             return True
  1231.  
  1232.  
  1233. class TransformiceAdminTools(object):
  1234.     def __init__(self, server):
  1235.         self.server = server
  1236.     def sendModMessage(self, message):
  1237.         for room in self.server.rooms.itervalues():
  1238.             room.informAll(TransformiceClientHandler.sendModMessage, [ADMIN_NAME, message])
  1239.     def playMusicInRoom(self, roomName, path):
  1240.         roomName = str(roomName)
  1241.         if self.server.rooms.has_key(roomName):
  1242.             self.server.rooms[roomName].playMusic(path)
  1243.  
  1244.  
  1245. #from http://www.acooke.org/cute/BasicHTTPA0.html
  1246. class VerifyingXMLRPCServer(SimpleXMLRPCServer):
  1247.     def __init__(self, *args, **kargs):
  1248.         # we use an inner class so that we can call out to the
  1249.         # authenticate method
  1250.         class VerifyingRequestHandler(SimpleXMLRPCRequestHandler):
  1251.             # this is the method we must override
  1252.             def parse_request(myself):
  1253.                 # first, call the original implementation which returns
  1254.                 # True if all OK so far
  1255.                 if SimpleXMLRPCRequestHandler.parse_request(myself):
  1256.                     # next we authenticate
  1257.                     if self.authenticate(myself.headers):
  1258.                         return True
  1259.                     else:
  1260.                         # if authentication fails, tell the client
  1261.                         myself.send_error(401, 'Authentication failed')
  1262.                         return False
  1263.         # and intialise the superclass with the above
  1264.         SimpleXMLRPCServer.__init__(self, requestHandler=VerifyingRequestHandler, *args, **kargs)
  1265.  
  1266.     def authenticate(self, headers):
  1267.         basic, _, encoded = headers.get('Authorization').partition(' ')
  1268.         assert basic == 'Basic', 'Only basic authentication supported'
  1269.         username, _, password = base64.b64decode(encoded).partition(':')
  1270.  
  1271.         return username.lower() in ADMIN_NAMES and hashlib.sha256(password).hexdigest() == ADMIN_HASH
  1272.  
  1273. if __name__ == "__main__":
  1274.     TEST = False
  1275.     server = TransformiceServer()
  1276.  
  1277.     adminTools = TransformiceAdminTools(server)
  1278.  
  1279.     rpcServer = VerifyingXMLRPCServer(('', 1110), allow_none=True)
  1280.     rpcServer.register_introspection_functions()
  1281.     rpcServer.register_instance(adminTools, True)
  1282.     thread.start_new_thread(rpcServer.serve_forever, ())
  1283.  
  1284.     asyncore.loop()
Add Comment
Please, Sign In to add comment