* The userrec will contain the oper mode 'o' as this function is called after any modifications
* are made to the user's structure by the core.
*/
- virtual void OnOper(userrec* user);
+ virtual void OnOper(userrec* user, std::string opertype);
/** Called whenever a user types /INFO.
* The userrec will contain the information of the user who typed the command. Modules may use this
virtual void OnUserMessage(userrec* user, void* dest, int target_type, std::string text);
virtual void OnUserNotice(userrec* user, void* dest, int target_type, std::string text);
+
+ virtual void OnMode(userrec* user, void* dest, int target_type, std::string text);
virtual int OnUserPreNick(userrec* user, std::string newnick);
{
strcat(user->modes,"o");
WriteServ(user->fd,"MODE %s :+o",user->nick);
- FOREACH_MOD OnOper(user);
+ FOREACH_MOD OnOper(user,OperType);
log(DEFAULT,"OPER: %s!%s@%s opered as type: %s",user->nick,user->ident,user->host,OperType);
AddOper(user);
}
{
log(DEBUG,"Local mode change");
WriteChannelLocal(chan, user, "MODE %s %s",chan->name,outstr);
+ FOREACH_MOD OnMode(user, chan, TYPE_CHANNEL, outstr);
}
else
{
if (strcmp(b,""))
{
WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
+ FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
}
if (strlen(dmodes)>MAXMODES)
if (strcmp(b,""))
{
WriteTo(user, dest, "MODE %s :%s", dest->nick, b);
+ FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
}
if (strlen(dmodes)>MAXMODES)
if (strcmp(b,""))
{
WriteTo(user,dest,"MODE %s :%s",dest->nick,b);
- log(DEBUG,"Sent: :%s MODE %s",user->nick,b);
+ FOREACH_MOD OnMode(user, dest, TYPE_USER, b);
}
if (strlen(dmodes)>MAXMODES)
void Module::OnServerRaw(std::string &raw, bool inbound, userrec* user) { }
int Module::OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) { return 0; }
int Module::OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list ¶ms) { return false; }
+void Module::OnMode(userrec* user, void* dest, int target_type, std::string text);
Version Module::GetVersion() { return Version(1,0,0,0,VF_VENDOR); }
-void Module::OnOper(userrec* user) { };
+void Module::OnOper(userrec* user, std::string opertype) { };
void Module::OnInfo(userrec* user) { };
void Module::OnWhois(userrec* source, userrec* dest) { };
int Module::OnUserPreInvite(userrec* source,userrec* dest,chanrec* channel) { return 0; };
InsertEntry((unsigned)category,(unsigned)nickid,(unsigned)hostid,(unsigned)sourceid,(unsigned long)time(NULL));
}
- virtual void OnOper(userrec* user)
+ virtual void OnOper(userrec* user, std::string opertype)
{
AddLogEntry(LT_OPER,user->nick,user->host,user->server);
}
}
}
- virtual void OnOper(userrec* user)
- {
- char* modes[2]; // only two parameters
- modes[0] = user->nick; // first parameter is the nick
- modes[1] = "+h"; // second parameter is the mode
- Srv->SendMode(modes,2,user); // send these, forming the command "MODE <nick> +h"
- }
-
virtual ~ModuleHelpop()
{
delete Srv;
}
- virtual void OnOper(userrec* user) {
+ virtual void OnOper(userrec* user, std::string opertype) {
if(operChan != "") {
return Version(1,0,0,1,VF_VENDOR);
}
- virtual void OnOper(userrec* user)
+ virtual void OnOper(userrec* user, std::string opertype)
{
// whenever a user opers, go through the oper types, find their <type:modes>,
// and if they have one apply their modes. The mode string can contain +modes
}
- virtual void OnOper(userrec* user) {
+ virtual void OnOper(userrec* user, std::string opertype) {
ShowOperMOTD(user);
return false;
}
+ bool OperType(std::string prefix, std::deque<std::string> params)
+ {
+ if (params.size() != 1)
+ return true;
+ std::string opertype = params[0];
+ userrec* u = Srv->FindNick(prefix);
+ if (u)
+ {
+ strlcpy(u->oper,opertype.c_str(),NICKMAX);
+ if (!strchr(u->modes,"o"))
+ {
+ strcat(u->modes,"o");
+ }
+ DoOneToAllButSender(u->server,"OPERTYPE",params,u->server);
+ }
+ return true;
+ }
+
bool RemoteServer(std::string prefix, std::deque<std::string> params)
{
if (params.size() < 4)
{
return this->RemoteServer(prefix,params);
}
+ else if (command == "OPERTYPE")
+ {
+ return this->OperType(prefix,params);
+ }
else if (command == "SQUIT")
{
if (params.size() == 2)
}
}
+ // note: the protocol does not allow direct umode +o except
+ // via NICK with 8 params. sending OPERTYPE infers +o modechange
+ // locally.
+ virtual void OnOper(userrec* user, std::string opertype)
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ std::deque<std::string> params;
+ params.push_back(opertype);
+ DoOneToMany(user->nick,"OPERTYPE",params);
+ }
+ }
+
virtual ~ModuleSpanningTree()
{
delete Srv;