vrobot4/source/server.rb

131 lines
3.1 KiB
Ruby

require './mod_base.rb'
module Vrobot4::Server
class User
attr_reader :name, :roles
end
class Channel
attr_reader :name
end
class Message
attr_reader :msg, :user, :chan, :serv
def initialize(**info)
@msg = info[:msg] if info.key? :msg
@user = info[:user] if info.key? :user
@chan = info[:chan] if info.key? :chan
@serv = info[:serv] if info.key? :serv
@reply = info[:reply] if info.key? :reply
@reply_b = info[:reply_b] if info.key? :reply_b
end
def reply *args
@reply.call args.join(" ")
end
def reply_b *args
@reply_b.call args.join(" ")
end
end
class Server
attr_reader :mprm
def initialize info
@info = info
@modules = [Mod_Base.new(nil)]
load_permissions info["permissions"] if info.key? "permissions"
end
def load_mod mod
mt = Vrobot4::Module.get_module_type(mod)
if mt[:server] and mt[:server] != type or
mt[:servflags] and mt[:servflags] !~ flags
raise ArgumentError, "Module " + mod + " not valid for this server"
end
@modules << mt[:type].new(@info.key?(mod) ? @info[mod] : nil)
end
def drop_mod mod
mt = Vrobot4::Module.get_module_type(mod)
@modules.each_index do |i|
@modules.delete_at i if @modules[i].is_a? mt[:type]
end
end
def each_mod
@modules.each {|mod| yield mod}
end
def onMessage m
@modules.each {|mod| break if mod.onMessage m}
end
def onCommand m, cnam, argv
@modules.each {|mod| break if mod.onCommand m, cnam, argv}
end
def type
"Unknown"
end
def flags
""
end
private
def load_permissions pinf
@mprm = {chan: {}, role: {}, glob: {}}
pinf.each do |perm|
mod = Vrobot4::Module.get_module_type(perm["module"])[:type]
if perm.key? "channel"
chan = perm["channel"]
@mprm[:chan][mod] = {} unless @mprm[:chan].key? chan
@mprm[:chan][mod][chan] = true
elsif perm.key? "roles"
@mprm[:role][mod] = perm["roles"]
else
@mprm[:glob][mod] = perm["enable"]
end
end
end
end
class AudioServer < Server
def voice_join m
raise NotImplementedError, "AudioServer::#voice_join not implemented"
end
def voice_quit m
raise NotImplementedError, "AudioServer::#voice_quit not implemented"
end
def play m, io
raise NotImplementedError, "AudioServer::#play not implemented"
end
def is_playing? m
raise NotImplementedError, "AudioServer::#is_playing? not implemented"
end
def flags
"A"
end
end
@@server_types = {}
def self.add_server_type t, name
@@server_types[name] = t
Vrobot4.log :INFO, "added server type:", name
end
def self.get_server_type s
@@server_types[s]
end
end
## EOF