a small chat client which uses erlv8 javascript
This commit is contained in:
parent
2daf20c039
commit
7732bb9742
4 changed files with 184 additions and 0 deletions
63
games/JS-chat/chat.rb
Normal file
63
games/JS-chat/chat.rb
Normal 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
|
||||||
23
games/JS-chat/chat_server.js
Normal file
23
games/JS-chat/chat_server.js
Normal 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);
|
||||||
|
}
|
||||||
15
games/JS-chat/ggs-delegate.rb
Normal file
15
games/JS-chat/ggs-delegate.rb
Normal 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
|
||||||
83
games/JS-chat/ggs-network.rb
Normal file
83
games/JS-chat/ggs-network.rb
Normal 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
|
||||||
Reference in a new issue