Here it is ... a more basic version
#include "client.h"
#include "winsock.h"
#include "q2irc.h"
#define IRCSERVER "irc.efnet.pl"
qboolean irc_connected = false;
int irc_sock;
struct sockaddr_in irc_addr;
char ircin[1024];
int cur;
//static char[1024] ircin;
//int ircin_count;
void ShiftBuffer (char* end)
{
char buf[1024];
int i, len;
strcpy(buf, end);
strcpy(ircin, buf);
cur=strlen(ircin);
return;
}
// Attempts to connect to an IRC server
void CL_IRC (void)
{
int err;
char* ircserver;
if (Cmd_Argc() < 2) {
Com_Printf("usage: irc <server>\n");
return;
}
ircserver = Cmd_Argv(1);
if (irc_connected)
CL_IRC_Disconnect();
// Setup remote address
if (!NET_StringToSockaddr (ircserver, &irc_addr)) {
Com_Printf("IRC: Couldn't resolve %s\n", ircserver);
return;
}
irc_addr.sin_family = AF_INET;
irc_addr.sin_port = htons(6667);
memset(&irc_addr.sin_zero,0,8);
irc_sock = socket(AF_INET, SOCK_STREAM, 0);
if (irc_sock == -1) {
Com_Printf ("IRC: Socket error.\n");
return;
}
err = connect(irc_sock, (struct sockaddr*)&irc_addr, sizeof(struct sockaddr));
if (err == -1) {
Com_Printf("IRC: Connect failed to %s\n", Cmd_Argv(1));
return;
}
// set non-blocking
err = 1;
ioctlsocket (irc_sock, FIONBIO, &err);
irc_connected = true;
cur=0;
// sleep(2);
send(irc_sock, "NICK Q2Irc\r\n", 12, 0);
send(irc_sock, "USER q2irc 221.163.111.20 irc.efnet.pl : q2irc\r\n", 48, 0);
send(irc_sock, "JOIN #klined\r\n", 14, 0);
return;
}
void CL_IRC_Recv(void)
{
char* end;
char* tok;
int err, ret;
if (!irc_connected)
return;
ret = recv(irc_sock, ircin+cur, 1023-cur, 0);
if (ret == -1) {
err = WSAGetLastError();
if (err == WSAEWOULDBLOCK)
return;
else {
CL_IRC_Disconnect();
return;
}
}
cur += ret;
ircin[cur] = 0;
while ((end = strstr(ircin, "\r\n")))
{
(*end) = 0;
*(end+1) = 0;
if (strstr(ircin, "PRIVMSG")) {
tok = strstr(ircin, "!");
*tok = 0;
Com_Printf("^1<%s>^r ", ircin+1);
tok = (strstr(tok+1, ":"));
Com_Printf("%s\n", tok+1);
}
ShiftBuffer(end+2);
}
/* if (strstr(ircin, "PING") == ircin) {
send(irc_sock, ircin+5, strlen(ircin)-5, 0);
return;
}
*/
return;
}
void CL_IRC_Disconnect(void) {
Com_Printf("IRC: Disconnecting..");
close(irc_sock);
Com_Printf("OK\n");
irc_connected = false;
return;
}
void CL_IRC_Say(void) {
char buf[1024];
if (Cmd_Argc() < 2)
return;
sprintf(buf, "PRIVMSG #klined :%s\r\n", Cmd_Argv(1));
if (send(irc_sock, buf, strlen(buf), 0) == -1) {
CL_IRC_Disconnect();
return;
}
Com_Printf("^1<%s>^r %s\n", "Q2Irc", Cmd_Argv(1));
return;
}