Advertisement
Guest User

Untitled

a guest
Apr 24th, 2016
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.82 KB | None | 0 0
  1. import json
  2.  
  3. GMCP = 201 #this is not chr"d for simplicity of interaction with the mushclient callbacks
  4. IAC = chr(255)
  5. SB = chr(250)
  6. SE = chr(240)
  7. DO = chr(0xFD)
  8.  
  9. def Send_GMCP_Packet(packet):
  10. try:
  11. if packet is None:
  12. world.Note( "Send_gmcp_packet got a null packet.")
  13. return True
  14. world.SendPkt(IAC + SB + chr(GMCP) + packet.replace("\\255", "\\255\\255") + IAC + SE)
  15. except:
  16. pass
  17. #logger.dump()
  18. return True
  19.  
  20. def OnPluginInstall():
  21. pass
  22. #cmds = ("ql", "allies")
  23. #send(sys["separator"].join(cmds))
  24. #load_roomdb()
  25.  
  26. def OnPluginTelnetSubnegotiation (msg_type, data):
  27. if msg_type != GMCP:
  28. return True
  29. if gmcp_debug:
  30. world.Note(str(data))
  31. if data:
  32. gmcp_decode(data)
  33. return True
  34.  
  35.  
  36. #Note that the returns are manditory.
  37. #Mush client needs the implicit return due to python"s inherent None return value
  38. def OnPluginTelnetRequest (msg_type, data):
  39. if msg_type == GMCP and data == "WILL":
  40. return True
  41. if msg_type == GMCP and data == "SENT_DO":
  42. Send_GMCP_Packet ("Core.Hello { 'client': 'MUSHclient', 'version': '4.80' }")
  43. Send_GMCP_Packet ("Core.Supports.Set [ 'Char 1', 'Char.Items 1', 'Room 1', 'Comm.Channel 1', 'IRE.Rift 1' ]")
  44. return True
  45. return False
  46.  
  47. #standard decoding stuff
  48. def _decode_list(data):
  49. rv = []
  50. for item in data:
  51. if isinstance(item, unicode):
  52. item = item.encode("utf-8")
  53. elif isinstance(item, list):
  54. item = _decode_list(item)
  55. elif isinstance(item, dict):
  56. item = _decode_dict(item)
  57. rv.append(item)
  58. return rv
  59.  
  60. def _decode_dict(data):
  61. rv = {}
  62. for key, value in data.iteritems():
  63. if isinstance(key, unicode):
  64. key = key.encode("utf-8")
  65. if isinstance(value, unicode):
  66. value = value.encode("utf-8")
  67. elif isinstance(value, list):
  68. value = _decode_list(value)
  69. elif isinstance(value, dict):
  70. value = _decode_dict(value)
  71. rv[key] = value
  72. return rv
  73.  
  74. def gmcp_decode(data):
  75. if " " in data:
  76. cmd, data = data.split(" ", 1)
  77. data = json.loads(data, object_hook=_decode_dict)
  78. else:
  79. cmd = data
  80. data = None
  81. gmcp.update(cmd, data)
  82.  
  83. class GmcpHandler(object):
  84. def __init__(self):
  85. self.map = {
  86. "Char.Vitals" : self.char_vitals,
  87. "Char.Status" : self.char_status,
  88. "Char.Defences.Add" : self.char_defences_add,
  89. "Char.Defences.List" : self.char_defences_list,
  90. "Char.Defences.Remove" : self.char_defences_remove,
  91. "Char.Afflictions.Add" : self.char_afflictions_add,
  92. "Char.Afflictions.Remove" : self.char_afflictions_remove,
  93. "Char.Afflictions.List" : self.char_afflictions_list,
  94. "Room.Info" : self.room_info,
  95. "Room.Players" : self.room_players,
  96. "Room.AddPlayer" : self.room_add_player,
  97. "Room.RemovePlayer" : self.room_remove_player,
  98. "Comm.Channel.Start" : self.channel_start,
  99. "Comm.Channel.Text" : self.channel_text,
  100. "Comm.Channel.End" : self.channel_end,
  101. "Char.Items.Add" : self.char_items_add,
  102. "Char.Items.Remove" : self.char_items_remove,
  103. "Char.Items.List" : self.char_items_list,
  104. }
  105. #self.evm = EventManager()
  106.  
  107. #def lost_bal(self, bal):
  108. #bals[bal].used()
  109. #self.evm.fire(Event("bal_off", bal))
  110.  
  111. #def gained_bal(self, bal):
  112. #bals[bal].regained()
  113. #self.evm.fire(Event("bal_on", bal))
  114.  
  115. def char_status(self, data):
  116. pass
  117. sys["prof"] = data.get("prof", sys["default_prof"]).lower()
  118.  
  119. def char_vitals(self, data):
  120. pass
  121. #if afflictions["blackout"].has():
  122. #return
  123. #for bal in ("bal", "eq", "herb", "focus", "tree", "purge", "salve", "pipe"):
  124. #if bals[bal].bal != int(data[bal]):
  125. #if bals[bal].bal:
  126. #self.lost_bal(bal)
  127. #else:
  128. #self.gained_bal(bal)
  129. #left = data["leftwield"]
  130. #right = data["rightwield"]
  131. #me.wield_left = None if left == 0 else weapon_manager.get_by_id(int(left))
  132. #me.wield_right = None if right == 0 else weapon_manager.get_by_id(int(right))
  133. #if data.has_key("bleed"):
  134. #self.evm.fire(Event("bleeding", int(data["bleed"]) / IMPERIAN_STAT_CAST))
  135. #if data.has_key("rage"):
  136. #berserker_set_rage(data["rage"])
  137. #elif data.has_key("kai"):
  138. #monk_set_kai(int(data["kai"]))
  139.  
  140. def char_afflictions_add(self, data):
  141. pass
  142. #aff = normalise_aff(aff)
  143. #if afflictions.has_key(aff):
  144. #afflictions[aff].gained()
  145. #else:
  146. #alert("Unhandled aff %s in char_afflictions_add" % data["name"])
  147.  
  148. def char_afflictions_remove(self, data):
  149. pass
  150. #for aff in data:
  151. #try:
  152. #aff = normalise_aff(aff)
  153. #afflictions[aff].cured(forced=True)
  154. #except:
  155. #continue #don"t judge me
  156.  
  157. def char_afflictions_list(self, data):
  158. pass
  159. #for aff in afflictions:
  160. #afflictions[aff].cured(silent=True)
  161. #for record in data:
  162. #try:
  163. #aff = normalise_aff(record)
  164. #if not afflictions.has_key(aff):
  165. #continue
  166. #afflictions[aff].gained()
  167. #except:
  168. #continue
  169.  
  170. def char_defences_add(self, data):
  171. pass
  172. #ondef(data.get("name", None))
  173.  
  174. def char_defences_remove(self, data):
  175. pass
  176. #for defence in data:
  177. #undef(defence)
  178.  
  179. def char_defences_list(self, data):
  180. pass
  181. #update_defence_list([d["name"] for d in data])
  182.  
  183. def room_info(self, data):
  184. pass
  185. #me.last_room = me.room
  186. #roomdb[data["num"]] = Room(**data)
  187. #me.room = roomdb[data["num"]]
  188. #self.evm.fire(Event("check_moved_room"))
  189.  
  190. def room_add_player(self, data):
  191. pass
  192. #try:
  193. #me.room.players.append(data["name"].lower()) #do not convert to set you had a good reason
  194. #except:
  195. #pass
  196.  
  197. #convert the following to use list methods at some point
  198. def room_remove_player(self, data):
  199. pass
  200. #if not me.room:
  201. #return
  202. #i = 0
  203. #name = data.lower()
  204. #while i < len(me.room.players):
  205. #if name == me.room.players[i]:
  206. #del me.room.players[i]
  207. #me.room.remove_blocker(name)
  208. #return
  209. #i += 1
  210.  
  211. def room_players(self, data):
  212. pass
  213. #try:
  214. #me.room.players = [p["name"].lower() for p in data]
  215. #except:
  216. #pass
  217.  
  218. def char_items_add(self, data):
  219. pass
  220. #id = data["item"]["id"]
  221. #name = data["item"]["name"]
  222. #attrib = data["item"]["attrib"] if "attrib" in data["item"] else None
  223. #loc = data["location"]
  224. #if loc == "room":
  225. #me.room.items.add(id, name, attrib)
  226. #elif loc == "inv":
  227. #me.inv.add(id, name, attrib)
  228.  
  229. def char_items_remove(self, data):
  230. pass
  231. #item = int(data["item"]["id"])
  232. #loc = data["location"]
  233. #if loc == "room":
  234. #if item in me.room.items:
  235. #del(me.room.items[item])
  236. #elif loc == "inv":
  237. #if item in me.inv:
  238. #del(me.inv.items[item])
  239.  
  240. def char_items_list(self, data):
  241. pass
  242. #loc = data["location"]
  243. #if loc == "room":
  244. #me.room.items.clear()
  245. #for item in data["items"]:
  246. #attrib = item["attrib"] if "attrib" in item else None
  247. #me.room.items.add(int(item["id"]), item["name"], attrib)
  248. #elif loc == "inv":
  249. #me.inv.clear()
  250. #for item in data["items"]:
  251. #attrib = item["attrib"] if "attrib" in item else None
  252. #me.inv.add(int(item["id"]), item["name"], attrib)
  253.  
  254. def channel_start(self, data):
  255. return
  256.  
  257. def channel_end(self, data):
  258. return
  259.  
  260. def channel_text(self, data):
  261. pass
  262. #talker = data["talker"]
  263. #text = filter_ansi(data["text"])
  264. #channel = data["channel"]
  265. #if talker.lower() in allies and channel.startswith("tell"):
  266. #handle_allied_tell(talker, text)
  267.  
  268. def update(self, cmd, data):
  269. if cmd not in self.map.keys():
  270. alert("Unhandled gmcp command '%s'" %cmd)
  271. return
  272. self.map[cmd](data)
  273.  
  274. gmcp = GmcpHandler()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement