From 7732bb974214b70f0bb485d3a5bab316836540a9 Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Sat, 30 Apr 2011 18:55:34 +0200 Subject: [PATCH] a small chat client which uses erlv8 javascript --- games/JS-chat/chat.rb | 63 ++++++++++++++++++++++++++ games/JS-chat/chat_server.js | 23 ++++++++++ games/JS-chat/ggs-delegate.rb | 15 +++++++ games/JS-chat/ggs-network.rb | 83 +++++++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 games/JS-chat/chat.rb create mode 100644 games/JS-chat/chat_server.js create mode 100644 games/JS-chat/ggs-delegate.rb create mode 100644 games/JS-chat/ggs-network.rb diff --git a/games/JS-chat/chat.rb b/games/JS-chat/chat.rb new file mode 100644 index 0000000..f336f50 --- /dev/null +++ b/games/JS-chat/chat.rb @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby -wKU + +$: << "." + +require 'ggs-network.rb' +require 'ggs-delegate.rb' + +class Chat + include GGSDelegate + + def initialize + @ggs_network = GGSNetwork.new(self) + @ggs_network.connect("localhost") + end + + def ggsNetworkReady(ggs_network, ready) + source_code = File.open("chat_server.js", "rb").read + @ggs_network.define(source_code) + end + + def ggsNetworkDefined(ggs_network, defined) + if defined + print "Your nickname: " + nick = gets.chomp + @ggs_network.sendCommand("/nick", nick) + Thread.new { + loop do + input + end + } + else + source_code = File.open("chat_server.js", "rb").read + @ggs_network.define(source_code) + end + end + + def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) + case command + when "message" then message(args) + when "notice" then notice(args) + end + end + + protected + + def message(message) + puts message + end + + def notice(notice) + puts "<#{notice}>" + end + + def input + message = gets.chomp + @ggs_network.sendCommand("message", message) + end + +end + +if __FILE__ == $0 + Chat.new +end diff --git a/games/JS-chat/chat_server.js b/games/JS-chat/chat_server.js new file mode 100644 index 0000000..d5279d6 --- /dev/null +++ b/games/JS-chat/chat_server.js @@ -0,0 +1,23 @@ +function playerCommand(player_id, command, args) { + if(command == "/nick") { + changeNick(player_id, args); + } else if(command == "message") { + message(player_id, args); + } +} + +function changeNick(player_id, nick) { + var old_nick = GGS.localStorage.getItem("nick_" + player_id); + GGS.localStorage.setItem("nick_" + player_id, nick); + + if (!old_nick) { + GGS.sendCommandToAll("notice", nick + " joined"); + } else { + GGS.sendCommandToAll("notice", old_nick + " is now called " + nick); + } +} + +function message(player_id, message) { + var nick = GGS.localStorage.getItem("nick_" + player_id); + GGS.sendCommandToAll(player_id, 'message', nick + "> " + message); +} \ No newline at end of file diff --git a/games/JS-chat/ggs-delegate.rb b/games/JS-chat/ggs-delegate.rb new file mode 100644 index 0000000..be4cc47 --- /dev/null +++ b/games/JS-chat/ggs-delegate.rb @@ -0,0 +1,15 @@ +module GGSDelegate + + def ggsNetworkReady(ggs_network, ready) + raise "ggsNetworkReady(ggs_network, ready) must be overridden" + end + + def ggsNetworkDefined(ggs_network, defined) + raise "ggsNetworkDefined(ggs_network, defined) must be overridden" + end + + def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) + raise "ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) must be overridden" + end + +end \ No newline at end of file diff --git a/games/JS-chat/ggs-network.rb b/games/JS-chat/ggs-network.rb new file mode 100644 index 0000000..8806ac5 --- /dev/null +++ b/games/JS-chat/ggs-network.rb @@ -0,0 +1,83 @@ +require 'socket' + +class GGSNetwork + + SERVER = "Server" + CLIENT = "Game" + + public + + attr_accessor :delegate + + def initialize(delegate) + @delegate = delegate + end + + def define(source_code) + write( makeMessage(SERVER, "define", source_code) ) + end + + def sendCommand(command, args="") + write( makeMessage(CLIENT, command, args) ) + end + + def connect(host='localhost', port=9000) + @socket = TCPSocket.new(host, port) + read + end + + protected + + def write(message) + @socket.write(message) + end + + def read + loop do + headers = {} + size = 0 + args = "" + + select([@socket], nil, nil) + + while (line = @socket.gets) != "\n" + break if line.nil? + + key, value = line.split(": ") + headers[key] = value.strip + end + + if headers.has_key?("Content-Size") + args = @socket.read(headers["Content-Size"].to_i) + end + + receivedCommand(headers, args) + end + end + + def receivedCommand(headers, data) + if headers.has_key? "Client-Command" + command = headers["Client-Command"] + case command + when "hello" + @game_token = data + @delegate.ggsNetworkReady(self, true) + when "defined" + @delegate.ggsNetworkDefined(self, true) + else + @delegate.ggsNetworkReceivedCommandWithArgs(self, command, data) + end + end + end + + def makeMessage(serverOrGame, command, args) + message = "Token: #{@game_token}\n" + + "#{serverOrGame}-Command: #{command}\n" + + "Content-Length: #{args.length}\n\n" + + message += args if args.length > 0 + + message + end + +end