Basic Login using Infinity Protocol: Connect to port 2770 or 2771 get — ignore it up to the end "\n" Send Infinity: Unicode "∞" ∞ U+221E INFINITY UTF-8: 0xE2 0x88 0x9E UTF-16: 0x221E C octal escaped UTF-8: \342\210\236 XML decimal entity: ∞ \u221e Or String "Infinity, please" ... followed by "\0" Receive: "∞\tYou're quite welcome.\t0\n\0"; ∞\t\t\n\0 > 0 ... ? send and receive JSON {"key":"value"} \0 { "c": COMMAND, "d": DATA } Pre-Login Commands: org.starhope.appius.game.PreLoginCommands do_ First stage login: { "c": "getApple", d: {} } All replies: { "from": , "status": , ... } { "from": , "status": "false", "msg": , ... } if ($reply->status === "false") { print $reply->msg, "\n"; } { "from": "getApple", "apple": } SHA1PASS := hex( sha1( . ) ) { "c": "login", "d": { "userName": WHO, "password": SHA1PASS, "zone": ZONENAME } } $o = new JSONObject; $o->c = "login"; { "from": "login", "status": "true", ... } JSON commands: org.starhope.appius.game.Commands com.tootsville.game.ExtensionCommands do_SOMETHING => { "c": SOMETHING ... } "jso" => "d": {...} op commands: org.starhope.appius.sys.op.OpCommands com.tootsville.game.ExtensionCommands op_SOMETHING => "#" . SOMETHING { "c": "speak", d: { "speech": "#" . SOMETHING . [ " " . PARAM , ... ]} } { "c": "speak", "d": { "speech": "#headcount #all" } } { "from": "admin", ... } $Eden = first Zone Log in to $Eden { 0: { name: ZONE NAME, host: SERVER HOSTNAME, port: NUM (if missing, port == port you already used) usersOn: ###, maxUsers: ###, bg: IMAGE, assetPath: URL-PART (usually "") buddies: ### }, 1: { ... }, } pick a Zone, & repeat login process with new Apple for my $zone (@zones) { ... } { "c": "speak", "d": { "speech": "#setvar @tootSquareWest nowPlaying TITLE..." } } { "c": "speak", "d": { "speech": "#setvar @tootTheater movie FILE.flv" } } "$@" => admin msg title admin msg with details ... often just print admin messages Join the room, get room vars...