a small chat client which uses erlv8 javascript

This commit is contained in:
Jeena Paradies 2011-04-30 18:55:34 +02:00
parent 2daf20c039
commit 7732bb9742
4 changed files with 184 additions and 0 deletions

63
games/JS-chat/chat.rb Normal file
View file

@ -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

View file

@ -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);
}

View file

@ -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

View file

@ -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