heimdall/proto.rb

222 lines
4.5 KiB
Ruby
Raw Normal View History

2023-04-30 07:56:21 +00:00
UIDS = {}
module Heimdall
2023-05-12 22:46:42 +00:00
VERSION = "0.99 beta"
2023-04-30 18:52:32 +00:00
attr_reader :VERSION
2023-05-12 22:46:42 +00:00
2023-04-30 18:52:32 +00:00
class ProtocolError < StandardError
end
2023-04-30 07:56:21 +00:00
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
2023-05-12 22:46:42 +00:00
def sync(data)
data.each { |userdata|
if not @users[userdata["protocol_id"]] then
new_user = User.new userdata
@users[new_user.protoid] = new_user
else
@users[userdata["protocol_id"]].modify(userdata)
end
}
end
2023-04-30 07:56:21 +00:00
def add(user)
@users[user.protoid] = user
end
def get(protoid)
2023-04-30 18:52:32 +00:00
raise ProtocolError, "user not found" if not @users[protoid]
return @users[protoid]
end
2023-05-11 09:06:28 +00:00
def search(name,n,&block)
@users.select(&block).take(n)
end
2023-05-12 22:46:42 +00:00
def search_by_name(name, n = 10)
2023-05-11 09:06:28 +00:00
search(name,n) { |k,v| v.username.match? name }
end
def search_by_protoid(name,n = 10)
search(name,n) { |k,v| k.match? name }
end
2023-05-12 22:46:42 +00:00
def filter(&block)
@users.filter &block
end
2023-04-30 18:52:32 +00:00
def delete(protoid)
@users.delete protoid
2023-04-30 07:56:21 +00:00
end
2023-05-12 22:46:42 +00:00
def bulk_delete(protoid_list)
protoid_list.each { |x| @users.delete x }
end
end
class RoomCache < UserCache
def get(protoid)
raise ProtocolError, "room not found" if not @users[protoid]
return @users[protoid]
end
def sync(data)
data.each { |userdata|
if not @users[userdata["protocol_id"]] then
new_user = Room.new userdata
@users[new_user.protoid] = new_user
else
@users[userdata["protocol_id"]].modify(userdata)
end
}
end
end
class RoomFilter
def initialize(cache, room_protoid)
@cache = cache
@filter = room_protoid
end
def get(protoid)
raise ProtocolError, "user not found" if not _filter[protoid]
return _filter[protoid]
end
private
def _filter
@cache.filter { |k,v|
v.protoid == @filter
}
end
2023-04-30 07:56:21 +00:00
end
class User < UID
2023-04-30 18:52:32 +00:00
def initialize(data)
@username = data["username"]
@protoid = data["protocol_id"]
2023-04-30 07:56:21 +00:00
@UID_prefix = "user"
2023-05-12 22:46:42 +00:00
@channel = DirectChannel.new
2023-04-30 07:56:21 +00:00
super()
end
2023-05-11 09:06:28 +00:00
def to_card()
return {
"username" => @username,
"protoid" => @protoid
}
end
2023-05-12 22:46:42 +00:00
def modify(data)
@username = data["username"]
end
attr_reader :username
attr_reader :protoid
attr_reader :channel
end
class Room < UID
def initialize(data)
@name = data["name"]
@protoid = data["protocol_id"]
@UID_prefix = "room"
@channel = RoomChannel.new
@users = {}
super()
end
def to_card()
return {
"name" => @name,
"protoid" => @protoid
}
end
def modify(data)
@name = data["name"]
end
attr_reader :users
2023-04-30 07:56:21 +00:00
attr_reader :username
attr_reader :protoid
2023-05-12 22:46:42 +00:00
attr_reader :channel
2023-04-30 07:56:21 +00:00
end
class Channel < UID
def initialize
@UID_prefix = "channel"
2023-04-30 18:52:32 +00:00
@messages = MsgStack.new
@read = 0
2023-04-30 07:56:21 +00:00
super()
end
2023-04-30 18:52:32 +00:00
def send(msg)
@messages.push(msg)
@read = @read+1
end
2023-05-11 21:41:59 +00:00
def send_silent(msg)
@messages.push(msg)
end
2023-04-30 18:52:32 +00:00
def get(n = 1)
raise Heimdall::ProtocolError, "Invalid number of messages" if n < 0
return @messages.pull(n)
end
def read()
messages = @messages.pull(@read)
@read = 0
return messages
end
2023-04-30 07:56:21 +00:00
end
class DirectChannel < Channel
def initialize
@UID_prefix = "dchannel"
super()
end
end
2023-05-05 07:13:48 +00:00
class RoomChannel < Channel
2023-04-30 07:56:21 +00:00
def initialize
@UID_prefix = "schannel"
super()
end
2023-05-12 22:46:42 +00:00
undef read
def get(n = 1)
@read = 0
super(n)
end
2023-04-30 07:56:21 +00:00
end
class Message < UID
2023-04-30 18:52:32 +00:00
def initialize(data)
@content = data["content"]
@from = data["from"]
@to = data["to"]
2023-04-30 07:56:21 +00:00
@UID_prefix = "message"
super()
end
2023-04-30 18:52:32 +00:00
def to_struct
return {
"content" => @content,
"from" => @from,
"to" => @to
}
end
attr_reader :content
attr_reader :from
attr_reader :to
2023-04-30 07:56:21 +00:00
end
class MsgStack < UID
def initialize
@UID_prefix = "msgstack"
2023-04-30 18:52:32 +00:00
@messages = []
2023-04-30 07:56:21 +00:00
super()
end
2023-04-30 18:52:32 +00:00
def push(msg)
@messages.append(msg)
end
def pull(n)
@messages.last n
end
2023-04-30 07:56:21 +00:00
end
end