module Vrobot4::Server 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 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 on_message m @modules.each {|mod| break if mod.on_message m} end def on_command m, cnam, argv @modules.each {|mod| break if mod.on_command m, cnam, argv} end def type "Unknown" end def flags "" end protected def load_permissions pinf raise NotImplementedError, "Server::#load_permissions not implemented" 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