Created
January 17, 2012 17:39
-
-
Save WA9ACE/1627759 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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