1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#include <winsock.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <vector>
#define SERVER "irc.SERVERNAMEHERE.com"
#define PORT 6667
#define TIMEOUT 10
#define NICK "NICKHERE"
#define CHAN "#CHANNELHERE"
using namespace std;
vector<char*> playerName;
// UNCHANGED BOT PROGRAM
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 parseARGS(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;
}
//END UNCHANGED BOT PROGRAM
int parseMessage(SOCKET *strSocket, Message_Struct *sMessage) {
char *argv[512];
int argc = parseARGS(argv, sMessage->cMessage);
//JOIN ROUTINE
else if (argv[0]!= NULL && !strcmp(argv[0], ":?join")) {
int i;
bool joinError = FALSE;
for (i=0; i<playerName.size(); ++i) {
if (playerName[i] == sMessage->cUserNick) joinError = TRUE; // checks to see if player is already in game
}
if (joinError == FALSE) {
sockPRINT(strSocket, "\r\nPRIVMSG %s :%c4,0%s has joined the table!\r\n", sMessage->cTarget, 3, sMessage->cUserNick);
playerName.push_back(sMessage->cUserNick);
} else sockPRINT(strSocket, "\r\nPRIVMSG %s :%c4,0%s has already joined the table!.\r\n", sMessage->cTarget, 3, sMessage->cUserNick);
}
return 0;
}
|