diff --git a/hyde b/hyde index c6e89af..fd76422 160000 --- a/hyde +++ b/hyde @@ -1 +1 @@ -Subproject commit c6e89afcfd115680ac4ddd7178f71782e9137402 +Subproject commit fd76422b760e6c045581bcb11842ee42221d06e0 diff --git a/proto.rb b/proto.rb new file mode 100644 index 0000000..d8ed3ad --- /dev/null +++ b/proto.rb @@ -0,0 +1,83 @@ +UIDS = {} + +module Heimdall + class UID + def initialize + @UID_prefix = "abstract" if not @UID_prefix + id = (1..32).map { |x| (rand()*10).floor }.join + while UIDS.has_key? id do + id = (1..32).map { |x| (rand()*10).floor }.join + end + UIDS[@UID_prefix+id] = self + @UID = id + end + attr_reader :UID + end + + class UserCache + def initialize + @users = {} + end + def add(user) + @users[user.protoid] = user + end + def get(protoid) + return @users[user.protoid] + end + end + + class User < UID + def initialize(username, protoid) + @username = username + @protoid = protoid + @UID_prefix = "user" + super() + end + attr_reader :username + attr_reader :protoid + end + + class Server < UID + def initialize + @UID_prefix = "server" + super() + end + end + + class Channel < UID + def initialize + @UID_prefix = "channel" + super() + end + + end + + class DirectChannel < Channel + def initialize + @UID_prefix = "dchannel" + super() + end + + end + + class ServerChannel < Channel + def initialize + @UID_prefix = "schannel" + super() + end + end + + class Message < UID + def initialize + @UID_prefix = "message" + super() + end + end + + class MsgStack < UID + def initialize + @UID_prefix = "msgstack" + super() + end + end +end diff --git a/server.rb b/server.rb new file mode 100644 index 0000000..9d90403 --- /dev/null +++ b/server.rb @@ -0,0 +1,44 @@ +require_relative "proto" +require_relative "hyde/hyde" +require "json" + +Users = Heimdall::UserCache.new + +def require_keys(dict,key_dict) + raise KeyError, "not a dict" unless dict.kind_of? Hash + key_dict.each_pair { |k,v| + unless (dict.has_key? k) and (dict[k].kind_of? v) then + raise KeyError, "key #{k} of type #{v} required" + end + } +end + +server = Hyde::Server.new Port: 8000 do + path "user" do + post "new" do |ctx| + req,res = ctx.request,ctx.response + begin + data = JSON::Parser.new(req.body).parse + require_keys(data,{ + username: String, + protocol_id: String + }) + Users.add(Heimdall::User.new data[:username], data[:protocol_id]) + rescue JSON::ParserError => jsonerror + res.body = JSON::fast_generate({ + error: "#{jsonerror}" + }) + res['Content-Type'] = "application/json" + res.status = 400 + rescue KeyError => keyerror + res.body = JSON::fast_generate({ + error: "#{keyerror}" + }) + res['Content-Type'] = "application/json" + res.status = 400 + end + end + end +end + +server.start