vrobot4/source/server.rb

184 lines
4.7 KiB
Ruby
Raw Normal View History

module Vrobot4::Server
2017-08-11 18:25:32 -07:00
class Mod_Base < Vrobot4::Module::Module
def initialize info
super
register :c_help, "help", "Prints documentation for commands."
register :c_die, "die", "Kills all bot instances.", roles: "o"
register :c_modr, "modr", "Reloads a module.", roles: "o"
register :c_modl, "modl", "Loads a module.", roles: "o"
register :c_modu, "modu", "Unloads a module.", roles: "o"
register :c_dbg, "dbg", "Sets the debug level.", roles: "o"
end
def c_help m, argv
check_args argv, "", "S"
if argv.length == 0
cmds = []
m.serv.each_mod {|mod| cmds << mod.all_cmds(m).keys.join(", ")}
cmds.delete ""
m.reply "Commands:", cmds.join(", ")
else
name = argv[0]
m.serv.each_mod do |mod|
if (cmd = mod.get_cmd m, name)
return m.reply name + ":", cmd.help_str
end
end
m.reply "Command not found:", name
end
end
def c_die m, argv
m.serv.voice_quit m if m.serv.flags.include? "A"
m.reply \
["STATUS: DYING",
"ded",
"proceeding to die",
"bye",
"dedededed",
"Thanks, bye!",
"GOTTAGOBYE",
"the orks insisted upon dying"].sample
exit
end
def c_modr m, argv
check_args argv, "S", "S"
m.serv.drop_mod argv[0]
load argv[1], true if argv.length > 1
m.serv.load_mod argv[0]
end
def c_modl m, argv
check_args argv, "S"
m.serv.load_mod argv[0]
end
def c_modu m, argv
check_args argv, "S"
m.serv.drop_mod argv[0]
end
def c_dbg m, argv
check_args argv, "N"
Vrobot4.debug = argv[0].to_i
end
def on_command m, cnam, argv
Vrobot4.log :DEBUGV, "command", cnam.to_s, argv.to_s
super
end
end
class User
attr_reader :name, :roles
end
class Channel
attr_reader :name
end
class Message
attr_reader :msg, :user, :chan, :serv
2017-08-08 21:00:28 -07:00
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
2017-08-08 04:33:30 -07:00
def reply_b *args
@reply_b.call args.join(" ")
end
end
class Server
attr_reader :mprm
def initialize info
2017-08-08 21:03:18 -07:00
@info = info
2017-08-09 00:52:34 -07:00
@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)
2017-08-11 18:50:43 -07:00
if mt[:server] and mt[:server] != self.class.type or
2017-08-08 04:32:45 -07:00
mt[:servflags] and mt[:servflags] !~ flags
raise ArgumentError, "Module " + mod + " not valid for this server"
end
2017-08-09 00:52:34 -07:00
@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
2017-08-11 15:16:16 -07:00
def on_message m
@modules.each {|mod| break if mod.on_message m}
end
2017-08-11 15:16:16 -07:00
def on_command m, cnam, argv
@modules.each {|mod| break if mod.on_command m, cnam, argv}
end
2017-08-08 04:32:45 -07:00
def flags
""
end
protected
def load_permissions pinf
raise NotImplementedError, "Server::#load_permissions not implemented"
end
end
2017-08-08 21:03:18 -07:00
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 = {}
2017-08-11 18:50:43 -07:00
def self.add_server_type type
@@server_types[type.type] = type
Vrobot4.log :INFO, "added server type:", type.type
end
def self.get_server_type s
@@server_types[s]
end
end
## EOF