+ virtual void OnGetServerDescription(std::string servername,std::string &description)
+ {
+ TreeServer* s = FindServer(servername);
+ if (s)
+ {
+ description = s->GetDesc();
+ }
+ }
+
+ virtual void OnUserInvite(userrec* source,userrec* dest,chanrec* channel)
+ {
+ if (std::string(source->server) == Srv->GetServerName())
+ {
+ std::deque<std::string> params;
+ params.push_back(dest->nick);
+ params.push_back(channel->name);
+ DoOneToMany(source->nick,"INVITE",params);
+ }
+ }
+
+ virtual void OnPostLocalTopicChange(userrec* user, chanrec* chan, std::string topic)
+ {
+ std::deque<std::string> params;
+ params.push_back(chan->name);
+ params.push_back(":"+topic);
+ DoOneToMany(user->nick,"TOPIC",params);
+ }
+
+ virtual void OnUserNotice(userrec* user, void* dest, int target_type, std::string text)
+ {
+ if (target_type == TYPE_USER)
+ {
+ userrec* d = (userrec*)dest;
+ if ((std::string(d->server) != Srv->GetServerName()) && (std::string(user->server) == Srv->GetServerName()))
+ {
+ std::deque<std::string> params;
+ params.clear();
+ params.push_back(d->nick);
+ params.push_back(":"+text);
+ DoOneToOne(user->nick,"NOTICE",params,d->server);
+ }
+ }
+ else
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ chanrec *c = (chanrec*)dest;
+ std::deque<std::string> params;
+ params.push_back(c->name);
+ params.push_back(":"+text);
+ DoOneToMany(user->nick,"NOTICE",params);
+ }
+ }
+ }
+
+ virtual void OnUserMessage(userrec* user, void* dest, int target_type, std::string text)
+ {
+ if (target_type == TYPE_USER)
+ {
+ // route private messages which are targetted at clients only to the server
+ // which needs to receive them
+ userrec* d = (userrec*)dest;
+ if ((std::string(d->server) != Srv->GetServerName()) && (std::string(user->server) == Srv->GetServerName()))
+ {
+ std::deque<std::string> params;
+ params.clear();
+ params.push_back(d->nick);
+ params.push_back(":"+text);
+ DoOneToOne(user->nick,"PRIVMSG",params,d->server);
+ }
+ }
+ else
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ chanrec *c = (chanrec*)dest;
+ std::deque<std::string> params;
+ params.push_back(c->name);
+ params.push_back(":"+text);
+ DoOneToMany(user->nick,"PRIVMSG",params);
+ }
+ }
+ }
+
+ virtual void OnUserJoin(userrec* user, chanrec* channel)
+ {
+ // Only do this for local users
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s JOINS %s",user->server,channel->name);
+ std::deque<std::string> params;
+ params.clear();
+ params.push_back(channel->name);
+ if (*channel->key)
+ {
+ log(DEBUG,"**** With key %s",channel->key);
+ // if the channel has a key, force the join by emulating the key.
+ params.push_back(channel->key);
+ }
+ DoOneToMany(user->nick,"JOIN",params);
+ }
+ }
+
+ virtual void OnUserPart(userrec* user, chanrec* channel)
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s PARTS %s",user->server,channel->name);
+ std::deque<std::string> params;
+ params.clear();
+ params.push_back(channel->name);
+ DoOneToMany(user->nick,"PART",params);
+ }
+ }
+
+ virtual void OnUserConnect(userrec* user)
+ {
+ char agestr[MAXBUF];
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s CONNECTS: %s",user->server,user->nick);
+ std::deque<std::string> params;
+ snprintf(agestr,MAXBUF,"%lu",(unsigned long)user->age);
+ params.clear();
+ params.push_back(agestr);
+ params.push_back(user->nick);
+ params.push_back(user->host);
+ params.push_back(user->dhost);
+ params.push_back(user->ident);
+ params.push_back("+"+std::string(user->modes));
+ params.push_back(user->ip);
+ params.push_back(":"+std::string(user->fullname));
+ DoOneToMany(Srv->GetServerName(),"NICK",params);
+ }
+ }
+
+ virtual void OnUserQuit(userrec* user, std::string reason)
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s QUITS: %s",user->server,user->nick);
+ std::deque<std::string> params;
+ params.push_back(":"+reason);
+ DoOneToMany(user->nick,"QUIT",params);
+ }
+ }
+
+ virtual void OnUserPostNick(userrec* user, std::string oldnick)
+ {
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s changes NICK: %s",user->server,user->nick);
+ std::deque<std::string> params;
+ params.push_back(user->nick);
+ DoOneToMany(oldnick,"NICK",params);
+ }
+ }
+
+ virtual void OnUserKick(userrec* source, userrec* user, chanrec* chan, std::string reason)
+ {
+ if (std::string(source->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"**** User on %s KICKs: %s %s",source->server,source->nick,user->nick);
+ std::deque<std::string> params;
+ params.push_back(chan->name);
+ params.push_back(user->nick);
+ params.push_back(":"+reason);
+ DoOneToMany(source->nick,"KICK",params);
+ }
+ }
+
+ virtual void OnRemoteKill(userrec* source, userrec* dest, std::string reason)
+ {
+ std::deque<std::string> params;
+ params.push_back(dest->nick);
+ params.push_back(":"+reason);
+ DoOneToMany(source->nick,"KILL",params);
+ }
+
+ virtual void OnRehash(std::string parameter)
+ {
+ if (parameter != "")
+ {
+ std::deque<std::string> params;
+ params.push_back(parameter);
+ DoOneToMany(Srv->GetServerName(),"REHASH",params);
+ // check for self
+ if (Srv->MatchText(Srv->GetServerName(),parameter))
+ {
+ Srv->RehashServer();
+ }
+ }
+ }
+
+ // 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 void OnMode(userrec* user, void* dest, int target_type, std::string text)
+ {
+ log(DEBUG,"*** ONMODE TRIGGER");
+ if (std::string(user->server) == Srv->GetServerName())
+ {
+ log(DEBUG,"*** LOCAL");
+ if (target_type == TYPE_USER)
+ {
+ userrec* u = (userrec*)dest;
+ std::deque<std::string> params;
+ params.push_back(u->nick);
+ params.push_back(text);
+ DoOneToMany(user->nick,"MODE",params);
+ }
+ else
+ {
+ chanrec* c = (chanrec*)dest;
+ std::deque<std::string> params;
+ params.push_back(c->name);
+ params.push_back(text);
+ DoOneToMany(user->nick,"MODE",params);
+ }
+ }
+ }
+