void IRC_Pong(const char *Param) { char OutBuf[2048]; snprintf(OutBuf, 2048, "PONG%s\r\n", Param + strlen("PING")); Net_Write(SocketDescriptor, OutBuf); }
Bool IRC_Message(const char *Target, const char *Message) { char OutString[2048]; snprintf(OutString, sizeof OutString, "PRIVMSG %s :%s\r\n", Target, Message); return Net_Write(SocketDescriptor, OutString); }
Bool IRC_NickChange(const char *Nick) { char OutString[2048]; snprintf(OutString, sizeof OutString, "NICK %s\r\n", Nick); return Net_Write(SocketDescriptor, OutString); }
Bool IRC_LeaveChannel(const char *Channel) { char ChanString[2048]; snprintf(ChanString, sizeof ChanString, "PART %s\r\n", Channel); return Net_Write(SocketDescriptor, ChanString); }
Bool IRC_Quit(const char *QuitMSG) { if (SocketDescriptor) { if (QuitMSG) { char OutBuf[2048]; snprintf(OutBuf, sizeof OutBuf, "QUIT :%s\r\n", QuitMSG); Net_Write(SocketDescriptor, OutBuf); } else Net_Write(SocketDescriptor, "QUIT :aqu4bot " BOT_VERSION " shutting down.\r\n"); } if (Net_Disconnect(SocketDescriptor)) { SocketDescriptor = 0; return true; } return false; }
static bool Main_ResumeFromSocket(void) { //Resumes our session from a socket. FILE *Descriptor = fopen("aqu4bot.socket", "rb"); char OkMessageTarget[128]; if (!Descriptor) return false; //Read in the socket. fread(&SocketDescriptor, 1, sizeof(int), Descriptor); //Read in the OK message target. int Char, Inc = 0; while ((Char = fgetc(Descriptor)) != EOF) { OkMessageTarget[Inc++] = Char; } OkMessageTarget[Inc] = '\0'; //Close the descriptor. fclose(Descriptor); //Delete the file. remove("aqu4bot.socket"); IRC_Message(OkMessageTarget, "New aqu4bot instance loaded. Rebuilding list of users in channels. Please wait..."); char OutBuf[1024]; //Now we need to send a names request to every channel to repopulate the user lists. for (struct ChannelTree *Worker = Channels; Worker; Worker = Worker->Next) { snprintf(OutBuf, sizeof OutBuf, "WHO %s\r\n", Worker->Channel); Net_Write(SocketDescriptor, OutBuf); } //Now send our I'm ok mommy speech. IRC_Message(OkMessageTarget, "Restart completed."); return true; }
Bool IRC_Notice(const char *Target, const char *Notice) { char OutString[2048]; snprintf(OutString, sizeof OutString, "NOTICE %s :%s\r\n", Target, Notice); return Net_Write(SocketDescriptor, OutString); }
Bool IRC_Connect(void) { char UserString[2048], NickString[2048], MessageBuf[2048]; struct ChannelTree *Worker = Channels; Bool ServerLikesUs = false; int Code = 0; printf("Connecting to \"%s:%hu\"... ", ServerInfo.Hostname, ServerInfo.PortNum), fflush(stdout); if (!Net_Connect(ServerInfo.Hostname, ServerInfo.PortNum, &SocketDescriptor)) goto Error; snprintf(UserString, sizeof UserString, "USER %s 8 * :%s\r\n", ServerInfo.Ident, ServerInfo.RealName); snprintf(NickString, sizeof NickString, "NICK %s\r\n", ServerInfo.Nick); Net_Write(SocketDescriptor, UserString); Net_Write(SocketDescriptor, NickString); /*Check if the server likes us.*/ while (!ServerLikesUs) { if (!Net_Read(SocketDescriptor, MessageBuf, sizeof MessageBuf, true)) goto Error; IRC_GetStatusCode(MessageBuf, &Code); if (Code == 0) continue; switch (Code) { case IRC_CODE_OK: ServerLikesUs = true; break; case IRC_CODE_NICKTAKEN: fprintf(stderr, "Nickname taken. Shutting down.\n"); close(SocketDescriptor); exit(1); break; default: break; } } puts("Connected."); if (ServerInfo.SetBotmode) { char OutBuf[2048]; printf("Setting +B on ourselves..."); snprintf(OutBuf, sizeof OutBuf, "MODE %s +B\r\n", ServerInfo.Nick); Net_Write(SocketDescriptor, OutBuf); puts(" Done."); } if (ServerInfo.NickservPwd[0] != '\0') { char NickservString[2048]; printf("Authenticating with NickServ..."); snprintf(NickservString, 2048, "identify %s", ServerInfo.NickservPwd); IRC_Message("NickServ", NickservString); puts(" Done."); } if (Channels) { printf("Joining channels..."), fflush(stdout); for (; Worker != NULL; Worker = Worker->Next) { IRC_JoinChannel(Worker->Channel); printf(" %s", Worker->Channel), fflush(stdout); } putc('\n', stdout); } puts("\nEverything's up, ready to go.\n----"), fflush(NULL); return true; Error: fprintf(stderr, "Failed\n"); return false; }