Beispiel #1
0
void IRC_Pong(const char *Param)
{
	char OutBuf[2048];
	
	snprintf(OutBuf, 2048, "PONG%s\r\n", Param + strlen("PING"));
	Net_Write(SocketDescriptor, OutBuf);
}
Beispiel #2
0
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);
}
Beispiel #3
0
Bool IRC_NickChange(const char *Nick)
{
	char OutString[2048];
	
	snprintf(OutString, sizeof OutString, "NICK %s\r\n", Nick);
	return Net_Write(SocketDescriptor, OutString);
}
Beispiel #4
0
Bool IRC_LeaveChannel(const char *Channel)
{
	char ChanString[2048];
	
	snprintf(ChanString, sizeof ChanString, "PART %s\r\n", Channel);
	
	return Net_Write(SocketDescriptor, ChanString);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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;
}
Beispiel #7
0
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);
}
Beispiel #8
0
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;
}