Skip to content

Instantly share code, notes, and snippets.

@WA9ACE
Created January 17, 2012 17:39
Show Gist options
  • Save WA9ACE/1627759 to your computer and use it in GitHub Desktop.
Save WA9ACE/1627759 to your computer and use it in GitHub Desktop.
#include <winsock.h>
#include <stdio.h>
#define SERVER "irc server"
#define PORT 6667
#define TIMEOUT 10
#define NICK "BOT"
#define CHAN "#your irc channel"
typedef struct {
char *cUserNick; // Nickname of user (eg: Tux)
char *cUserHost; // Userhost of user (eg: lenience.com)
char *cUserName; // Username of user (eg: root)
char *cTarget; // Pointer to channel or private chat nick...
char *cMessage; // Message sent by user
} Message_Struct;
bool arrayShift(char *cBuffer);
int socketConnect(SOCKET *connection, char *HName, int Port);
int sockPRINT(SOCKET *strSocket, char* cMessage, ...);
int parseArguments(char **args, char *line);
int parseMessage(SOCKET *strSocket, Message_Struct *sMessage);
int main(int argc, char *argv[]) {
char cBuffer[512];
char cOutBuffer[512];
char *lineSPLIT[512];
char *args[10];
int bRecv;
SOCKET strSocket;
Message_Struct sMessage;
int tries;
for(tries=1; socketConnect(&strSocket, SERVER, PORT)!=0; tries++) {
printf("Failed attempt: %d\r\n",tries);
Sleep(TIMEOUT*1000);
}
sockPRINT(&strSocket, "USER %s \"\" \"127.0.0.1\" :%s\r\n", NICK, NICK);
sockPRINT(&strSocket, "NICK %s\r\n", NICK);
Sleep(100);
sockPRINT(&strSocket, "JOIN %s\r\n", CHAN);
printf("Success!\n");
while(1) {
memset(cBuffer, 0, 512);
memset(cOutBuffer, 0, 512);
bRecv = recv(strSocket, cBuffer, 512, 0);
if( (bRecv == 0) || (bRecv == SOCKET_ERROR) ) break;
if(cBuffer[0]!=':') {
strcpy(cOutBuffer, "PONG :");
sockPRINT(&strSocket, cOutBuffer);
} else {
sMessage.cUserNick = strtok(cBuffer, "!");
arrayShift(sMessage.cUserNick);
sMessage.cUserName = strtok(NULL, "@");
sMessage.cUserHost = strtok(NULL, " "); //THE SENDER IP
strtok(NULL, " "); //THE PRIVMSG
sMessage.cTarget = strtok(NULL, " "); //RECEIVED IN CHAT ON CHANNEL / NICK
sMessage.cMessage = strtok(NULL, "\r\n"); //THE MESSAGE WITH A :
parseMessage(&strSocket, &sMessage);
}
}
closesocket(strSocket);
return (1);
}
bool arrayShift(char *cBuffer) {
for(int i=0; i<strlen(cBuffer); i++) cBuffer[i]=cBuffer[i+1];
cBuffer[strlen(cBuffer)]='\0';
return (1);
}
int socketConnect(SOCKET *connection, char *HName, int Port) {
SOCKADDR_IN serverInfo;
WSADATA wsaData;
LPHOSTENT hostEntry;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) == -1) return (-1);
if (!(hostEntry = gethostbyname(HName))) {
WSACleanup();
return (-1);
}
if ((*connection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
WSACleanup();
return (-1);
}
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
serverInfo.sin_port = htons(Port);
if (connect(*connection, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)) == SOCKET_ERROR) {
WSACleanup();
return (-1);
}
return (0);
}
int sockPRINT(SOCKET *strSocket, char* cMessage, ...) {
char cBuffer[512];
int iError;
va_list va;
va_start(va, cMessage);
vsprintf(cBuffer, cMessage, va);
va_end(va);
send(*strSocket, cBuffer, strlen(cBuffer), 0);
return 1;
}
int parseARGS(char **args, char *line){
int tmp=0;
args[tmp] = strtok( line, "|" );
while ( (args[++tmp] = strtok(NULL, "|" ) ) != NULL );
return tmp - 1;
}
int parseMessage(SOCKET *strSocket, Message_Struct *sMessage) {
char *argv[512];
int argc = parseARGS(argv, sMessage->cMessage);
if(argv[0]!= NULL && !strcmp(argv[0], ":#exit")){
sockPRINT(strSocket, "\r\nPRIVMSG %s :%c4,0%s called exit routine.\r\n", sMessage->cTarget, 3, sMessage->cUserNick);
//replace sMessage->cTarget with sMessage->cUserNick if u want to do this in a private chat...
sockPRINT(strSocket, "\r\nQUIT :%s forced exit.", sMessage->cUserNick);
Sleep(3000);
closesocket(*strSocket);
ExitProcess(0);
}
else if (argv[0]!= NULL && !strcmp(argv[0], ":#helo")) {
sockPRINT(strSocket, "\r\nPRIVMSG %s :%c4,0HELLO THERE %s !.\r\n", sMessage->cTarget, 3, sMessage->cUserNick);
//replace sMessage->cTarget with sMessage->cUserNick if u want to do this in a private chat...
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment