From 4428fbd3369dc9ad0b777af79487017487e910e3 Mon Sep 17 00:00:00 2001 From: Greg Taylor Date: Sat, 11 Apr 2009 07:26:58 +0000 Subject: [PATCH] Added stubs for all of the IMC packets. Also re-named the event. --- src/imc2/events.py | 11 +- src/imc2/packets.py | 535 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 505 insertions(+), 41 deletions(-) diff --git a/src/imc2/events.py b/src/imc2/events.py index 4bbe80defc..affd8aaa46 100644 --- a/src/imc2/events.py +++ b/src/imc2/events.py @@ -8,26 +8,25 @@ from src import scheduler from src.imc2 import connection as imc2_conn from src.imc2.packets import * -class IEvt_IMC2_KeepAlive(events.IntervalEvent): +class IEvt_IMC2_IsAlive(events.IntervalEvent): """ Event: Send periodic keepalives to network neighbors. This lets the other games know that our game is still up and connected to the network. Also provides some useful information about the client game. """ - name = 'IEvt_IMC2_KeepAlive' + name = 'IEvt_IMC2_IsAlive' # Send keep-alive packets every 15 minutes. interval = 900 - description = "Send an IMC2 keepalive packet." + description = "Send an IMC2 is-alive packet." def event_function(self): """ This is the function that is fired every self.interval seconds. """ - packet = IMC2PacketIsAlive() - imc2_conn.IMC2_PROTOCOL_INSTANCE.send_packet(packet) + imc2_conn.IMC2_PROTOCOL_INSTANCE.send_packet(IMC2PacketIsAlive()) def add_events(): """ Adds the IMC2 events to the scheduler. """ - scheduler.add_event(IEvt_IMC2_KeepAlive()) \ No newline at end of file + scheduler.add_event(IEvt_IMC2_IsAlive()) \ No newline at end of file diff --git a/src/imc2/packets.py b/src/imc2/packets.py index 9046d8f220..104f07e9a2 100644 --- a/src/imc2/packets.py +++ b/src/imc2/packets.py @@ -69,24 +69,51 @@ class IMC2Packet(object): self._get_optional_data_string()) return packet.strip() -class IMC2PacketWhois(IMC2Packet): +class IMC2PacketAuthPlaintext(object): + """ + IMC2 plain-text authentication packet. Auth packets are strangely + formatted, so this does not sub-class IMC2Packet. The SHA and plain text + auth packets are the two only non-conformers. + + CLIENT Sends: + PW version= autosetup (SHA256) + + Optional Arguments( required if using the specified authentication method: + (SHA256) The literal string: SHA256. This is sent to notify the server + that the MUD is SHA256-Enabled. All future logins from this + client will be expected in SHA256-AUTH format if the server + supports it. + """ + def assemble(self): + """ + This is one of two strange packets, just assemble the packet manually + and go. + """ + return 'PW %s %s version=%s autosetup %s\n' %( + settings.IMC2_MUDNAME, + settings.IMC2_CLIENT_PW, + settings.IMC2_PROTOCOL_VERSION, + settings.IMC2_SERVER_PW) + +class IMC2PacketKeepAliveRequest(IMC2Packet): """ Description: - Sends a request to the network for the location of the specified player. + This packet is sent by a MUD to trigger is-alive packets from other MUDs. + This packet is usually followed by the sending MUD's own is-alive packet. + It is used in the filling of a client's MUD list, thus any MUD that doesn't + respond with an is-alive isn't marked as online on the sending MUD's mudlist. Data: - level= The permission level of the person making the request. + (none) - Example: - You@YourMUD 1234567890 YourMUD whois dude@* level=5 + Example of a received keepalive-request: + *@YourMUD 1234567890 YourMUD!Hub1 keepalive-request *@* + + Example of a sent keepalive-request: + *@YourMUD 1234567890 YourMUD keepalive-request *@* """ - def __init__(self, pobject, whois_target): - self.sender = pobject - self.packet_type = 'whois' - self.target = whois_target - self.destination = '*' - self.optional_data = [('level', '5')] - + pass + class IMC2PacketIsAlive(IMC2Packet): """ Description: @@ -130,29 +157,467 @@ class IMC2PacketIsAlive(IMC2Packet): ('url', '"http://evennia.com"'), ('host', 'test.com'), ('port', '5555')] - -class IMC2PacketAuthPlaintext(object): + +class IMC2PacketIceRefresh(IMC2Packet): """ - IMC2 plain-text authentication packet. Auth packets are strangely - formatted, so this does not sub-class IMC2Packet. The SHA and plain text - auth packets are the two only non-conformers. + Description: + This packet is sent by the MUD to request data about the channels on the + network. Servers with channels reply with an ice-update packet for each + channel they control. The usual target for this packet is IMC@$. - CLIENT Sends: - PW version= autosetup (SHA256) + Data: + (none) - Optional Arguments( required if using the specified authentication method: - (SHA256) The literal string: SHA256. This is sent to notify the server - that the MUD is SHA256-Enabled. All future logins from this - client will be expected in SHA256-AUTH format if the server - supports it. - """ - def assemble(self): - """ - This is one of two strange packets, just assemble the packet manually - and go. - """ - return 'PW %s %s version=%s autosetup %s\n' %( - settings.IMC2_MUDNAME, - settings.IMC2_CLIENT_PW, - settings.IMC2_PROTOCOL_VERSION, - settings.IMC2_SERVER_PW) \ No newline at end of file + Example: + *@YourMUD 1234567890 YourMUD!Hub1 ice-refresh IMC@$ + """ + pass + +class IMC2PacketIceUpdate(IMC2Packet): + """ + Description: + A server returns this packet with the data of a channel when prompted with + an ice-refresh request. + + Data: + channel= + The channel's network name in the format of ServerName:ChannelName + + owner= + The Name@MUD of the channel's owner + + operators= + A space-seperated list of the Channel's operators, in the format of Person@MUD + + policy= + The policy is either "open" or "private" with no quotes. + + invited= + The space-seperated list of invited User@MUDs, only valid for a + "private" channel. + + excluded= + The space-seperated list of banned User@MUDs, only valid for "open" + channels. + + level= The default level of the channel: Admin, Imp, Imm, + Mort, or None + + localname= The suggested local name of the channel. + + Examples: + + Open Policy: + ICE@Hub1 1234567890 Hub1!Hub2 ice-update *@YourMUD channel=Hub1:ichat owner=Imm@SomeMUD operators=Other@SomeMUD policy=open excluded="Flamer@badMUD Jerk@dirtyMUD" level=Imm localname=ichat + + Private Policy: + ICE@Hub1 1234567890 Hub1!Hub2 ice-update *@YourMUD channel=Hub1:secretchat owner=Imm@SomeMUD operators=Other@SomeMUD policy=private invited="SpecialDude@OtherMUD CoolDude@WeirdMUD" level=Mort localname=schat + """ + pass + +class IMC2PacketIceMsgRelayed(IMC2Packet): + """ + Description: + The -r in this ice-msg packet means it was relayed. This, along with the + ice-msg-p packet, are used with private policy channels. The 'r' stands + for 'relay'. All incoming channel messages are from ICE@, where + is the server hosting the channel. + + Data: + realfrom= + The User@MUD the message came from. + + channel= + The Server:Channel the message is intended to be displayed on. + + text= + The message text. + + emote= + An integer value designating emotes. 0 for no emote, 1 for an emote, + and 2 for a social. + + Examples: + ICE@Hub1 1234567890 Hub1!Hub2 ice-msg-r *@YourMUD realfrom=You@YourMUD channel=hub1:secret text="Aha! I got it!" emote=0 + + ICE@Hub1 1234567890 Hub1!Hub2 ice-msg-r *@YourMUD realfrom=You@YourMUD channel=hub1:secret text=Ahh emote=0 + + ICE@Hub1 1234567890 Hub1!Hub2 ice-msg-r *@YourMUD realfrom=You@YourMUD channel=hub1:secret text="grins evilly." emote=1 + + ICE@Hub1 1234567890 Hub1!Hub2 ice-msg-r *@YourMUD realfrom=You@YourMUD channel=hub1:secret text="You@YourMUD grins evilly!" emote=2 + """ + pass + +class IMC2PacketIceMsgPrivate(IMC2Packet): + """ + Description: + This packet is sent when a player sends a message to a private channel. + This packet should never be seen as incoming to a client. The target of + this packet should be IMC@ of the server hosting the channel. + + Data: + channel= + The Server:Channel the message is intended to be displayed on. + + text= + The message text. + + emote= + An integer value designating emotes. 0 for no emote, 1 for an emote, + and 2 for a social. + + echo= + Tells the server to echo the message back to the sending MUD. This is only + seen on out-going messages. + + Examples: + You@YourMUD 1234567890 YourMUD ice-msg-p IMC@Hub1 channel=Hub1:secret text="Ahh! I got it!" emote=0 echo=1 + You@YourMUD 1234567890 YourMUD ice-msg-p IMC@Hub1 channel=Hub1:secret text=Ahh! emote=0 echo=1 + You@YourMUD 1234567890 YourMUD ice-msg-p IMC@Hub1 channel=Hub1:secret text="grins evilly." emote=1 echo=1 + You@YourMUD 1234567890 YourMUD ice-msg-p IMC@Hub1 channel=Hub1:secret text="You@YourMUD grins evilly." emote=2 echo=1 + """ + pass + +class IMC2PacketIceMsgBroadcasted(IMC2Packet): + """ + Description: + This is the packet used to chat on open policy channels. When sent from a + MUD, it is broadcasted across the network. Other MUDs receive it in-tact + as it was sent by the originating MUD. The server that hosts the channel + sends the packet back to the originating MUD as an 'echo' by removing the + "echo=1" and attaching the "sender=Person@MUD" data field. + + Data: + channel= + The Server:Channel the message is intended to be displayed on. + + text= + The message text. + + emote= + An integer value designating emotes. 0 for no emote, 1 for an emote, + and 2 for a social. + + *echo= + This stays on broadcasted messages. It tells the channel's server to + relay an echo back. + + *sender= + The hosting server replaces "echo=1" with this when sending the echo back + to the originating MUD. + + Examples: + (See above for emote/social examples as they are pretty much the same) + + Return Echo Packet: + You-YourMUD@Hub1 1234567890 Hub1 ice-msg-b *@YourMUD text=Hi! channel=Hub1:ichat sender=You@YourMUD emote=0 + + Broadcasted Packet: + You@YourMUD 1234567890 YourMUD!Hub1 ice-msg-b *@* channel=Hub1:ichat text=Hi! emote=0 echo=1 + """ + pass + +class IMC2PacketUserCache(IMC2Packet): + """ + Description: + Sent by a MUD with a new IMC2-able player or when a player's gender changes, + this packet contains only the gender for data. The packet's origination + should be the Player@MUD. + + Data: + gender= 0 is male, 1 is female, 2 is anything else such as neuter. + Will be referred to as "it". + + Example: + Dude@someMUD 1234567890 SomeMUD!Hub2!Hub1 user-cache *@* gender=0 + """ + pass + +class IMC2PacketUserCacheRequest(IMC2Packet): + """ + Description: + The MUD sends this packet out when making a request for the user-cache + information of the user included in the data part of the packet. + + Data: + user= The Person@MUD whose data the MUD is seeking. + + Example: + *@YourMUD 1234567890 YourMUD user-cache-request *@SomeMUD user=Dude@SomeMUD + """ + pass + +class IMC2PacketUserCacheReply(IMC2Packet): + """ + Description: + A reply to the user-cache-request packet. It contains the user and gender + for the user. + + Data: + user= + The Person@MUD whose data the MUD requested. + + gender= + The gender of the Person@MUD in the 'user' field. + + Example: + *@someMUD 1234567890 SomeMUD!Hub2!Hub1 user-cache-reply *@YourMUD user=Dude@SomeMUD gender=0 + """ + pass + +class IMC2PacketTell(IMC2Packet): + """ + Description: + This packet is used to communicate private messages between users on MUDs + across the network. + + Data: + text= Message text + isreply= Two settings: 1 denotes a reply, 2 denotes a tell social. + + Example: + + Originating: + You@YourMUD 1234567890 YourMUD tell Dude@SomeMUD text="Having fun?" + + Reply from Dude: + Dude@SomeMUD 1234567890 SomeMUD!Hub1 tell You@YourMUD text="Yeah, this is cool!" isreply=1 + """ + pass + +class IMC2PacketEmote(IMC2Packet): + """ + Description: + This packet seems to be sent by servers when notifying the network of a new + channel or the destruction of a channel. + + Data: + channel= + Unsure of what this means. The channel seen in both creation and + destruction packets is 15. + + level= + I am assuming this is the permission level of the sender. In both + creation and destruction messages, this is -1. + + text= + This is the message to be sent to the users. + + Examples: + ICE@Hub1 1234567890 Hub1 emote *@* channel=15 level=-1 text="the channel called hub1:test has been destroyed by You@YourMUD." + """ + pass + +class IMC2PacketRemoteAdmin(IMC2Packet): + """ + Description: + This packet is used in remote server administration. Please note that + SHA-256 Support is *required* for a client to use this feature. The command + can vary, in fact this very packet is highly dependant on the server it's + being directed to. In most cases, sending the 'list' command will have a + remote-admin enabled server send you the list of commands it will accept. + + Data: + command= + The command being sent to the server for processing. + + data= + Data associated with the command. This is not always required. + + hash= + The SHA-256 hash that is verified by the server. This hash is generated in + the same manner as an authentication packet. + + Example: + You@YourMUD 1234567890 YourMUD remote-admin IMC@Hub1 command=list hash= + """ + pass + +class IMC2PacketIceCmd(IMC2Packet): + """ + Description: + Used for remote channel administration. In most cases, one must be listed + as a channel creator on the target server in order to do much with this + packet. Other cases include channel operators. + + Data: + channel= + The target server:channel for the command. + + command= + The command to be processed. + + data= + Data associated with the command. This is not always required. + + Example: + You@YourMUD 1234567890 YourMUD ice-cmd IMC@hub1 channel=hub1:ichat command=list + """ + pass + +class IMC2PacketDestroy(IMC2Packet): + """ + Description: + Sent by a server to indicate the destruction of a channel it hosted. + The mud should remove this channel from its local configuration. + + Data: + channel= The server:channel being destroyed. + """ + pass + +class IMC2PacketWho(IMC2Packet): + """ + Description: + A seemingly mutli-purpose information-requesting packet. The istats + packet currently only works on servers, or at least that's the case on + MUD-Net servers. The 'finger' type takes a player name in addition to the + type name. + + Example: "finger Dude". The 'who' and 'info' types take no argument. + The MUD is responsible for building the reply text sent in the who-reply + packet. + + Data: + type= Types: who, info, "finger ", istats (server only) + + Example: + Dude@SomeMUD 1234567890 SomeMUD!Hub1 who *@YourMUD type=who + """ + pass + +class IMC2PacketWhoReply(IMC2Packet): + """ + Description: + The multi-purpose reply to the multi-purpose information-requesting 'who' + packet. The MUD is responsible for building the return data, including the + format of it. The mud can use the permission level sent in the original who + packet to filter the output. The example below is the MUD-Net format. + + Data: + text= The formatted reply to a 'who' packet. + + Additional Notes: + The example below is for the who list packet. The same construction would + go into formatting the other types of who packets. + + Example: + *@YourMUD 1234567890 YourMUD who-reply Dude@SomeMUD text="\n\r~R-=< ~WPlayers on YourMUD ~R>=-\n\r ~Y-=< ~Wtelnet://yourmud.domain.com:1234 ~Y>=-\n\r\n\r~B--------------------------------=< ~WPlayers ~B>=---------------------------------\n\r\n\r ~BPlayer ~z<--->~G Mortal the Toy\n\r\n\r~R-------------------------------=< ~WImmortals ~R>=--------------------------------\n\r\n\r ~YStaff ~z<--->~G You the Immortal\n\r\n\r~Y<~W2 Players~Y> ~Y<~WHomepage: http://www.yourmud.com~Y> <~W 2 Max Since Reboot~Y>\n\r~Y<~W3 logins since last reboot on Tue Feb 24, 2004 6:55:59 PM EST~Y>" + """ + pass + +class IMC2PacketWhois(IMC2Packet): + """ + Description: + Sends a request to the network for the location of the specified player. + + Data: + level= The permission level of the person making the request. + + Example: + You@YourMUD 1234567890 YourMUD whois dude@* level=5 + """ + def __init__(self, pobject, whois_target): + self.sender = pobject + self.packet_type = 'whois' + self.target = whois_target + self.destination = '*' + self.optional_data = [('level', '5')] + +class IMC2PacketWhoisReply(IMC2Packet): + """ + Description: + The reply to a whois packet. The MUD is responsible for building and formatting + the text sent back to the requesting player, and can use the permission level + sent in the original whois packet to filter or block the response. + + Data: + text= The whois text. + + Example: + *@SomeMUD 1234567890 SomeMUD!Hub1 whois-reply You@YourMUD text="~RIMC Locate: ~YDude@SomeMUD: ~cOnline.\n\r" + """ + pass + +class IMC2PacketBeep(IMC2Packet): + """ + Description: + Sends out a beep packet to the Player@MUD. The client receiving this should + then send a bell-character to the target player to 'beep' them. + + Example: + You@YourMUD 1234567890 YourMUD beep dude@somemud + """ + pass + +class IMC2PacketIceChanWho(IMC2Packet): + """ + Description: + Sends a request to the specified MUD or * to list all the users listening + to the specified channel. + + Data: + level= + Sender's permission level. + + channel= + The server:chan name of the channel. + + lname= + The localname of the channel. + + Example: + You@YourMUD 1234567890 YourMUD ice-chan-who somemud level=5 channel=Hub1:ichat lname=ichat + """ + pass + +class IMC2PacketIceChanWhoReply(IMC2Packet): + """ + Description: + This is the reply packet for an ice-chan-who. The MUD is responsible for + creating and formatting the list sent back in the 'list' field. The + permission level sent in the original ice-chan-who packet can be used to + filter or block the response. + + Data: + channel= + The server:chan of the requested channel. + + list= + The formatted list of local listeners for that MUD. + + Example: + *@SomeMUD 1234567890 SomeMUD!Hub1 ice-chan-whoreply You@YourMUD channel=Hub1:ichat list="The following people are listening to ichat on SomeMUD:\n\r\n\rDude\n\r" + """ + pass + +class IMC2PacketLaston(IMC2Packet): + """ + Description: + This packet queries the server the mud is connected to to find out when a + specified user was last seen by the network on a public channel. + + Data: + username= The user, user@mud, or "all" being queried. Responses + to this packet will be sent by the server in the form of a series of tells. + + Example: User@MUD 1234567890 MUD imc-laston SERVER username=somenamehere + """ + pass + +class IMC2PacketCloseNotify(IMC2Packet): + """ + Description: + This packet alerts the network when a server or MUD has disconnected. The + server hosting the server or MUD is responsible for sending this packet + out across the network. Clients need only process the packet to remove the + disconnected MUD from their MUD list (or mark it as Disconnected). + + Data: + host= + The MUD or server that has disconnected from the network. + + Example: + *@Hub2 1234567890 Hub2!Hub1 close-notify *@* host=DisconnMUD + """ + pass \ No newline at end of file