Advertisement
Guest User

Untitled

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