usingGee;classModuleMucCommands:Module{protectedweakModuleMucmuc;publicdelegatevoidCommandHandler(ModuleMuc.Conferenceconf,ModuleMuc.Occupantuser,stringcommand,string?arguments);publicclassCommand:Object{publicweakModulemod;publicCommandHandlerhnd;}protectedHashMap<string,Command>commands;publicstringgetconf(stringjid,stringkey,string?def){varres=cfg["muc "+jid,key];if(res==null)res=cfg["muc",key];if(res==null)res=def;returnres;}publicboolregister(stringcommand,Modulemod,CommandHandlerhandler){varcmd=newCommand();cmd.mod=mod;/* this will cause "copying delegates is discouraged" warning. that's okay, this delegate's data needs no destroy notify */cmd.hnd=handler;if(commands.has_key(command))log("muc_commands",LogLevelFlags.LEVEL_WARNING,"Command '%s' defined by '%s' was redefined by '%s'.",command,commands[command].mod.name(),mod.name());commands[command]=cmd;returntrue;}publicboolunregister(stringcommand){returncommands.unset(command);}protectedvoidhnd_modules(ModuleMuc.Conferenceconf,ModuleMuc.Occupantuser,stringcommand,string?arguments){varsb=newStringBuilder();sb.append("Loaded modules:");muc.name();foreach(varmodinconn.modules)sb.append(" "+mod.name());user.public_message(sb.str);}protectedvoidhnd_status(ModuleMuc.Conferenceconf,ModuleMuc.Occupantuser,stringcommand,string?arguments){varsb=newStringBuilder();sb.append("Status:");foreach(varroominmuc.rooms.values){sb.append(" ");sb.append(room.jid.split("@",2)[0]);sb.append("[");sb.append(room.enabled?"EN":"DIS");sb.append(":");switch(room.state){caseModuleMuc.State.CONNECTED:sb.append("C");break;caseModuleMuc.State.DISCOVERING:sb.append("DS");break;caseModuleMuc.State.CONNECTING:sb.append(">C");break;caseModuleMuc.State.DISCONNECTING:sb.append(">D");break;caseModuleMuc.State.DISCONNECTED:sb.append("D");break;}sb.append("]");}user.public_message(sb.str);}publicModuleMucCommands(Configcfg,Connectionconn){base(cfg,conn);commands=newHashMap<string,Command>();foreach(varmoduleinconn.modules){if(module.name()=="muc")muc=(ModuleMuc)module;}if(muc==null)log("muc_log",LogLevelFlags.LEVEL_ERROR,"Module 'muc' is not loaded");muc.on_message.connect((conf,user,message,body)=>{if((user!=null)&&(body!=null)&&(message.get_child("delay")==null)){if(getconf(conf.jid,"commands","no")!="yes")return;if(body.has_prefix(conf.nick)){vartxt=body[conf.nick.length:body.length];if(txt.has_prefix(": ")||txt.has_prefix(", ")){varcommand_n_args=txt[2:txt.length].split(" ",2);varcommand=commands[command_n_args[0]];if(command!=null)command.hnd(conf,user,command_n_args[0],(command_n_args.length>1)?command_n_args[1]:null);}}}});register("modules",this,hnd_modules);register("status",this,hnd_status);}publicoverridestringname(){return"muc_commands";}}