WriteChannelWithServ(ServerName,chan,user,"MODE %s %s",chan->name,outstr);
// M token for a usermode must go to all servers
char buffer[MAXBUF];
- snprintf(buffer,MAXBUF,"M %s %s",ServerName,chan->name, outstr);
+ snprintf(buffer,MAXBUF,"M %s %s",chan->name, outstr);
for (int j = 0; j < 255; j++)
{
if (servers[j] != NULL)
{
if (strcmp(servers[j]->name,ServerName))
{
- if (ChanAnyOnThisServer(chan,servers[j]->name))
- {
- me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
- log(DEBUG,"Sent M token");
- }
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent M token");
}
}
}
{
if (strcmp(servers[j]->name,ServerName))
{
- if (ChanAnyOnThisServer(chan,servers[j]->name))
- {
- me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
- log(DEBUG,"Sent m token");
- }
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent m token");
}
}
}
WriteServ(user->fd,"367 %s %s %s %s %d",user->nick, Ptr->name, i->data, i->set_by, i->set_time);
}
WriteServ(user->fd,"368 %s %s :End of channel ban list",user->nick, Ptr->name);
+ return;
}
}
u->InviteTo(c->name);
WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name);
WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name);
+
+ // i token must go to ALL servers!!!
+ char buffer[MAXBUF];
+ snprintf(buffer,MAXBUF,"i %s %s %s",u->nick,user->nick,c->name);
+ for (int j = 0; j < 255; j++)
+ {
+ if (servers[j] != NULL)
+ {
+ if (strcmp(servers[j]->name,ServerName))
+ {
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent i token");
+ }
+ }
+ }
}
void handle_topic(char **parameters, int pcnt, userrec *user)
strcpy(Ptr->setby,user->nick);
Ptr->topicset = time(NULL);
WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic);
+
+ // t token must go to ALL servers!!!
+ char buffer[MAXBUF];
+ snprintf(buffer,MAXBUF,"t %s %s :%s",user->nick,Ptr->name,topic);
+ for (int j = 0; j < 255; j++)
+ {
+ if (servers[j] != NULL)
+ {
+ if (strcmp(servers[j]->name,ServerName))
+ {
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent t token");
+ }
+ }
+ }
}
else
{
}
}
+void send_network_quit(const char* nick, const char* reason)
+{
+ char buffer[MAXBUF];
+ snprintf(buffer,MAXBUF,"Q %s :%s",nick,reason);
+ for (int j = 0; j < 255; j++)
+ {
+ if (servers[j] != NULL)
+ {
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent Q token");
+ }
+ }
+}
+
void handle_quit(char **parameters, int pcnt, userrec *user)
{
user_hash::iterator iter = clientlist.find(user->nick);
{
if (servers[j] != NULL)
{
- if (CommonOnThisServer(user,servers[j]->name))
- {
- me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
- log(DEBUG,"Sent Q token");
- }
- }
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent Q token");
+ }
}
}
else
{
if (servers[j] != NULL)
{
- if (CommonOnThisServer(user,servers[j]->name))
- {
- me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
- log(DEBUG,"Sent Q token");
- }
- }
+ me[defaultRoute]->SendPacket(buffer,servers[j]->internal_addr,servers[j]->internal_port,MyKey);
+ log(DEBUG,"Sent Q token");
+ }
}
}
FOREACH_MOD OnUserQuit(user);
return c;
}
-int chancount(void)
+long chancount(void)
{
return chanlist.size();
}
-int servercount(void)
+long count_servs(void)
{
- return 1;
+ int c = 0;
+ for (int j = 0; j < 255; j++)
+ {
+ if (servers[j] != NULL)
+ c++;
+ }
+ return c;
+}
+
+long servercount(void)
+{
+ return count_servs()+1;
}
+long local_count()
+{
+ int c = 0;
+ for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+ {
+ if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,ServerName))) c++;
+ }
+ return c;
+}
+
+
void handle_lusers(char **parameters, int pcnt, userrec *user)
{
WriteServ(user->fd,"251 %s :There are %d users and %d invisible on %d servers",user->nick,usercnt()-usercount_invisible(),usercount_invisible(),servercount());
WriteServ(user->fd,"252 %s %d :operator(s) online",user->nick,usercount_opers());
WriteServ(user->fd,"253 %s %d :unknown connections",user->nick,usercount_unknown());
WriteServ(user->fd,"254 %s %d :channels formed",user->nick,chancount());
- WriteServ(user->fd,"254 %s :I have %d clients and 0 servers",user->nick,usercnt());
+ WriteServ(user->fd,"254 %s :I have %d clients and %d servers",user->nick,local_count(),count_servs());
}
void handle_admin(char **parameters, int pcnt, userrec *user)
}
}
+// calls a handler function for a command
+
+void call_handler(const char* commandname,char **parameters, int pcnt, userrec *user)
+{
+ for (int i = 0; i < cmdlist.size(); i++)
+ {
+ if (!strcasecmp(cmdlist[i].command,commandname))
+ {
+ if (cmdlist[i].handler_function)
+ {
+ if (pcnt>=cmdlist[i].min_params)
+ {
+ if (strchr(user->modes,cmdlist[i].flags_needed))
+ {
+ cmdlist[i].handler_function(parameters,pcnt,user);
+ }
+ }
+ }
+ }
+ }
+}
+
void handle_stats(char **parameters, int pcnt, userrec *user)
{
if (pcnt != 1)
LinkPort = atoi(Link_Port);
if (match(Link_ServerName,parameters[0])) {
found = true;
+ break;
}
}
for (int j = 0; j < 255; j++) {
if (servers[j] == NULL) {
servers[j] = new serverrec;
+ //servers[j]->initiator = true;
strcpy(servers[j]->internal_addr,Link_IPAddr);
servers[j]->internal_port = LinkPort;
strcpy(servers[j]->name,Link_ServerName);
return c;
}
+long map_count(serverrec* s)
+{
+ int c = 0;
+ for (user_hash::const_iterator i = clientlist.begin(); i != clientlist.end(); i++)
+ {
+ if ((i->second->fd) && (isnick(i->second->nick)) && (!strcasecmp(i->second->server,s->name))) c++;
+ }
+ return c;
+}
+
void handle_links(char **parameters, int pcnt, userrec *user)
{
WriteServ(user->fd,"364 %s %s %s :0 %s",user->nick,ServerName,ServerName,ServerDesc);
void handle_map(char **parameters, int pcnt, userrec *user)
{
- WriteServ(user->fd,"006 %s :%s",user->nick,ServerName);
+ char line[MAXBUF];
+ snprintf(line,MAXBUF,"006 %s :%s",user->nick,ServerName);
+ while (strlen(line) < 50)
+ strcat(line," ");
+ WriteServ(user->fd,"%s%d (%.2f%%)",line,local_count(),(float)(((float)local_count()/(float)usercnt())*100));
for (int j = 0; j < 255; j++)
{
if (servers[j] != NULL)
{
- WriteServ(user->fd,"006 %s :%c-%s",user->nick,islast(servers[j]),servers[j]->name);
+ snprintf(line,MAXBUF,"006 %s :%c-%s",user->nick,islast(servers[j]),servers[j]->name);
+ while (strlen(line) < 50)
+ strcat(line," ");
+ WriteServ(user->fd,"%s%d (%.2f%%)",line,map_count(servers[j]),(float)(((float)map_count(servers[j])/(float)usercnt())*100));
}
}
WriteServ(user->fd,"007 %s :End of /MAP",user->nick);
}
+void handle_i(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
+{
+ char* nick = strtok(params," ");
+ char* from = strtok(NULL," ");
+ char* channel = strtok(NULL," ");
+ userrec* u = Find(nick);
+ userrec* user = Find(from);
+ chanrec* c = FindChan(channel);
+ if ((c) && (u) && (user))
+ {
+ u->InviteTo(c->name);
+ WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name);
+ }
+}
+
+void handle_t(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
+{
+ char* setby = strtok(params," ");
+ char* channel = strtok(NULL," :");
+ char* topic = strtok(NULL,"\r\n");
+ topic++;
+ userrec* u = Find(setby);
+ chanrec* c = FindChan(channel);
+ if ((c) && (u))
+ {
+ WriteChannelLocal(c,u,"TOPIC %s :%s",c->name,topic);
+ strncpy(c->topic,topic,MAXTOPIC);
+ strncpy(c->setby,u->nick,NICKMAX);
+ }
+}
+
void handle_T(char token,char* params,serverrec* source,serverrec* reply, char* udp_host,int udp_port)
{
nb_start = time(NULL);
WriteOpers("Server %s is starting netburst.",source->name);
break;
+ // ?
+ // ping
+ case '?':
+ reply->SendPacket("!",udp_host,udp_port,MyKey);
+ break;
+ // ?
+ // pong
+ case '!':
+ break;
+ // *
+ // no operation
+ case '*':
+ break;
// N <TS> <NICK> <HOST> <DHOST> <IDENT> <MODES> <SERVER> :<GECOS>
// introduce remote client
case 'N':
handle_N(token,params,source,reply,udp_host,udp_port);
break;
+ // t <NICK> <CHANNEL> :<TOPIC>
+ // change a channel topic
+ case 't':
+ handle_t(token,params,source,reply,udp_host,udp_port);
+ break;
+ // i <NICK> <CHANNEL>
+ // invite a user to a channel
+ case 'i':
+ handle_i(token,params,source,reply,udp_host,udp_port);
+ break;
// k <SOURCE> <DEST> <CHANNEL> :<REASON>
+ // kick a user from a channel
case 'k':
handle_k(token,params,source,reply,udp_host,udp_port);
break;
strcpy(servers[j]->description,serverdesc);
servers[j]->internal_port = udp_port;
// create a server record for this server
+ WriteOpers("Server %s authenticated, exchanging server keys...",servername);
snprintf(response,10240,"O %d",MyKey);
serv->SendPacket(response,udp_host,udp_port,0);
return;
{
fd_set sfd;
- struct timeval tval;
+ timeval tval;
FD_ZERO(&sfd);
user_hash::iterator count2 = clientlist.begin();