2233 lines
62 KiB
C
2233 lines
62 KiB
C
|
#include "tnn.h"
|
|||
|
#ifdef L1IRC
|
|||
|
#include "conversd.h"
|
|||
|
|
|||
|
static T_INTERFACE *ifpp; /* Zeiger auf das Aktuelle Interface.*/
|
|||
|
|
|||
|
void IrcAwayCommand(CONNECTION *cp); /* Username aufloesen. */
|
|||
|
void IrcChannelCommand(CONNECTION *cp); /* CHANNEL-Kommando. */
|
|||
|
void IrcHelpCommand(CONNECTION *cp); /* Help Kommand. */
|
|||
|
void IrcLinksCommand(CONNECTION *cp); /* Links-Kommando. */
|
|||
|
void IrcListCommand(CONNECTION *cp); /* List-Kommando. */
|
|||
|
void IrcNickCommand(CONNECTION *cp); /* Nickname aufloesen. */
|
|||
|
void IrcModeCommand(CONNECTION *cp); /* Mode-Kommando. */
|
|||
|
void IrcNamesCommand(CONNECTION *cp); /* Names-Kommando. */
|
|||
|
void IrcPartCommand(CONNECTION *cp); /* Channel schliessen. */
|
|||
|
void IrcPersonalCommand(CONNECTION *cp); /* Personal-Text setzen/loeschen. */
|
|||
|
void IrcPingCommand(CONNECTION *cp);
|
|||
|
void IrcPongCommand(CONNECTION *cp);
|
|||
|
void IrcPrivmsgCommand(CONNECTION *cp); /* MSG-Kommando. */
|
|||
|
void IrcQuitCommand(CONNECTION *cp); /* Quit-Kommando. */
|
|||
|
void IrcUserHostCommand(CONNECTION *cp); /* */
|
|||
|
void IrcSquitCommand(CONNECTION *cp);
|
|||
|
void IrcUserCommand(CONNECTION *cp);
|
|||
|
void IrcWhoCommand(CONNECTION *cp); /* Who-Kommando. */
|
|||
|
void IrcWhoisCommand(CONNECTION *cp); /* Userdaten ausgeben. */
|
|||
|
|
|||
|
|
|||
|
typedef struct cmdtable_irc
|
|||
|
{
|
|||
|
char *name;
|
|||
|
void (*fnc)(CONNECTION *);
|
|||
|
char *help;
|
|||
|
} CMDTABLE_IRC;
|
|||
|
|
|||
|
CMDTABLE_IRC cmdtable_irc[] =
|
|||
|
{
|
|||
|
{"away", IrcAwayCommand, "AWAY"},
|
|||
|
{"channel", IrcChannelCommand, "CHAN"},
|
|||
|
{"help", IrcHelpCommand, "HELP"},
|
|||
|
{"nick", IrcNickCommand, "NICK"},
|
|||
|
{"join", IrcChannelCommand, "JOIN"},
|
|||
|
{"links", IrcLinksCommand, "LINKS"},
|
|||
|
{"list", IrcListCommand, "LIST"},
|
|||
|
{"mode", IrcModeCommand, "MODE"},
|
|||
|
{"names", IrcNamesCommand, "NAMES"},
|
|||
|
{"part", IrcPartCommand, "PART"},
|
|||
|
{"personal", IrcPersonalCommand, "PERS"},
|
|||
|
{"ping", IrcPingCommand, "PING"},
|
|||
|
{"pong", IrcPongCommand, "PONG"},
|
|||
|
{"privmsg", IrcPrivmsgCommand, "PRIVMSG"},
|
|||
|
{"quit", IrcQuitCommand, "QUIT"},
|
|||
|
{"user", IrcUserCommand, "USER"},
|
|||
|
{"userhost", IrcUserHostCommand, "USERHOST"},
|
|||
|
{"squit", IrcSquitCommand, "SQUIT"},
|
|||
|
{"who", IrcWhoCommand, "WOH"},
|
|||
|
{"whois", IrcWhoisCommand, "WHOIS"},
|
|||
|
{NULL, 0, NULL}
|
|||
|
};
|
|||
|
|
|||
|
/* IRC-Server Einstellung aendern/setzen. */
|
|||
|
void ccpirc(void)
|
|||
|
{
|
|||
|
MBHEAD *mbp;
|
|||
|
char ch;
|
|||
|
int tmp_fd = EOF;
|
|||
|
int newloglevel = 0;
|
|||
|
int new_tcp_port = 0;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(ccpirc)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
ifpp = &ifp[IRC_ID]; /* Dann Zeiger auf das IRC-Interface. */
|
|||
|
|
|||
|
if (issyso() && skipsp(&clicnt, &clipoi)) /* Sysop will aendern. */
|
|||
|
{
|
|||
|
clicnt--;
|
|||
|
ch = toupper(*clipoi++);
|
|||
|
|
|||
|
switch (ch)
|
|||
|
{
|
|||
|
case 'P': /* Sysop will IRC-Port a<>ndern */
|
|||
|
if (!skipsp(&clicnt, &clipoi))
|
|||
|
{
|
|||
|
putmsg("Invalid Parameter\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
new_tcp_port = nxtlong(&clicnt, &clipoi); /* Neuen Port ermitteln */
|
|||
|
|
|||
|
if ( (new_tcp_port < 1)
|
|||
|
||(new_tcp_port > 65535))
|
|||
|
{
|
|||
|
putmsg("TCP-Port not valid, not changed !!!\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (ifpp->actively == FALSE) /* IRC ist deaktiv.*/
|
|||
|
{
|
|||
|
putmsg("TCP-Port haven not switched on!\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
/* Wenn NEUER Port und ALTER Port gleich sind, nicht neu Initialisieren.*/
|
|||
|
if (ifpp->tcpport == Htons((unsigned short)new_tcp_port))
|
|||
|
{
|
|||
|
putmsg("TCP-Port successfully changed\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/* Neuen TCP-Port Initialisieren. */
|
|||
|
if ((tmp_fd = SetupTCP(ifpp->name, (unsigned short)new_tcp_port)) != EOF)
|
|||
|
{
|
|||
|
#ifdef OS_STACK
|
|||
|
int tmp_fd_OS;
|
|||
|
|
|||
|
if ((tmp_fd_OS = SetupOS(ifpp, (unsigned short)new_tcp_port)) != EOF)
|
|||
|
{
|
|||
|
/* alten Socket schliessen */
|
|||
|
close(ifpp->OsSock);
|
|||
|
/* Neuen Socket merken */
|
|||
|
ifpp->OsSock = tmp_fd_OS;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Close(tmp_fd);
|
|||
|
putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
#endif /* OS_STACK */
|
|||
|
|
|||
|
Close(ifpp->ISock); /* Alten Socket schliessen. */
|
|||
|
ifpp->ISock = tmp_fd ; /* Neuen Socket merken */
|
|||
|
}
|
|||
|
else
|
|||
|
{ /* Neuen TCP-Port liess sich nicht Initialisieren. */
|
|||
|
putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ifpp->tcpport = Htons((unsigned short)new_tcp_port);
|
|||
|
|
|||
|
putmsg("TCP-Port successfully changed\r");
|
|||
|
return;
|
|||
|
|
|||
|
case 'L': /* Sysop will LOGLevel aendern */
|
|||
|
if (!skipsp(&clicnt, &clipoi))
|
|||
|
{
|
|||
|
mbp = putals("IRC-Server:\r");
|
|||
|
putprintf(mbp, "My LogLevel: %d\r",ifpp->log); /* Loglevel anzeigen. */
|
|||
|
|
|||
|
prompt(mbp);
|
|||
|
seteom(mbp);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
newloglevel = nxtnum(&clicnt, &clipoi); /* neuen Loglevel ermitteln. */
|
|||
|
|
|||
|
if ( (newloglevel < 0)
|
|||
|
||(newloglevel > 3)) /* Pruefe neuen Loglevel. */
|
|||
|
{
|
|||
|
mbp = putals("IRC-Server:\r");
|
|||
|
putprintf(mbp, "Error: Log level worth from 0 to 3!\r");
|
|||
|
prompt(mbp);
|
|||
|
seteom(mbp);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
ifpp->log = newloglevel; /* Neuen Loglevel setzen und zeigen */
|
|||
|
mbp = putals("IRC-Server:\r");
|
|||
|
putprintf(mbp, "My Loglevel: %d\r", ifpp->log);
|
|||
|
|
|||
|
prompt(mbp);
|
|||
|
seteom(mbp);
|
|||
|
return;
|
|||
|
break;
|
|||
|
|
|||
|
|
|||
|
default: /* Ungueltiger Parameter. */
|
|||
|
putmsg("Invalid Parameter\r");
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
mbp = putals("IRC-Server:\r"); /* Aktuelle Einstellungen zeigen. */
|
|||
|
|
|||
|
putprintf(mbp, "My TCP-Port: %u\r", Ntohs(ifpp->tcpport));
|
|||
|
prompt(mbp);
|
|||
|
seteom(mbp);
|
|||
|
}
|
|||
|
|
|||
|
char *get_mode_flags2irc(int flags)
|
|||
|
{
|
|||
|
static char mode[16];
|
|||
|
char *p = mode;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(get_mode_flags2irc)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
p = mode;
|
|||
|
if (flags & M_CHAN_I)
|
|||
|
*p++ = 's';
|
|||
|
|
|||
|
if (flags & M_CHAN_M)
|
|||
|
*p++ = 'm';
|
|||
|
|
|||
|
if (flags & M_CHAN_T)
|
|||
|
*p++ = 't';
|
|||
|
|
|||
|
if (flags & M_CHAN_P)
|
|||
|
*p++ = 'i';
|
|||
|
|
|||
|
if (flags & M_CHAN_S)
|
|||
|
*p++ = 'p';
|
|||
|
|
|||
|
// always +n
|
|||
|
*p++ = 'n';
|
|||
|
//if (flags & M_CHAN_L)
|
|||
|
//*p++ = 'l';
|
|||
|
//*p++ = ' ';
|
|||
|
|
|||
|
*p = 0;
|
|||
|
|
|||
|
return mode;
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Eingehende Befehle bearbeiten. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void ProcessIrcInput(char *cnvinbuf, CONNECTION *cp)
|
|||
|
{
|
|||
|
CMDTABLE_IRC *IrcCmdp;
|
|||
|
char *cmd;
|
|||
|
char buffer[2048];
|
|||
|
int cmdlen;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(ProcessIrcInput)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
cnvinbuf[2048] = 0;
|
|||
|
|
|||
|
cmd = getarg(cnvinbuf, 0); /* Befehl einlesen. */
|
|||
|
|
|||
|
if (cmd[0] == FALSE) /* kein befehl, */
|
|||
|
return; /* brechen wir ab. */
|
|||
|
|
|||
|
cmdlen = strlen(cmd); /* Befehlslange ermitteln. */
|
|||
|
/* durchsuche Befehls-Liste. */
|
|||
|
for (IrcCmdp = cmdtable_irc; IrcCmdp->name; IrcCmdp++)
|
|||
|
{
|
|||
|
if (!strncmp(IrcCmdp->name, cmd, cmdlen)) /* Befehl vergleichen. */
|
|||
|
{
|
|||
|
(*IrcCmdp->fnc) (cp); /* Befehl ausfuehren. */
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
/* Ungueltiger Befehl. */
|
|||
|
sprintf(buffer, ":%s 421 %s *** Unknown command '/%s'. Type /HELP for help.\n"
|
|||
|
, myhostname
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, cmd);
|
|||
|
appenddirect(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Away (Ab/Anwesend) setzen. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcAwayCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *AwayText;
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcAwayCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
AwayText = getarg(NULL, GET_ALL); /* akt. Away-Text ermitteln. */
|
|||
|
|
|||
|
if (*AwayText == ':') /* ':' im String. */
|
|||
|
AwayText++; /* ':' loeschen. */
|
|||
|
|
|||
|
if (AwayText == NULL) /* Kein Text. */
|
|||
|
return; /* Keine Aenderung. */
|
|||
|
|
|||
|
cp->away = AwayText; /* Aktualisiere den aktuellen Away-Text. */
|
|||
|
|
|||
|
if (*AwayText != '\0') /* Abmelden. */
|
|||
|
sprintf(buffer, ":%s 301 %s %s : %s\n" /* IRC-Meldung vorbereiten, */
|
|||
|
, myhostname
|
|||
|
, cp->name
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, AwayText);
|
|||
|
else /* Anmelden. */
|
|||
|
sprintf(buffer, ":%s 320 %s %s : is back\n" /* IRC-Meldung vorbereiten. */
|
|||
|
, myhostname
|
|||
|
, cp->name
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name));
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
#ifndef CONVNICK
|
|||
|
send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */
|
|||
|
cp->hosthostname,
|
|||
|
currtime,
|
|||
|
AwayText);
|
|||
|
#else
|
|||
|
send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */
|
|||
|
cp->nickname,
|
|||
|
cp->host,
|
|||
|
currtime,
|
|||
|
AwayText);
|
|||
|
#endif /* CONVNICK */
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Persoenlichen Text setzen. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcPersonalCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *pers;
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcPersonalCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
pers = getarg(NULL, GET_ALL); /* akt. Pers-Text ermitteln. */
|
|||
|
|
|||
|
if (*pers)
|
|||
|
{
|
|||
|
if (!strcmp(pers, "@")) /* Pers-Text soll geloescht werden. */
|
|||
|
pers = ""; /* Pers-Text loeschen. */
|
|||
|
|
|||
|
personalmanager(SET, cp, pers); /* Datenbank aktualisieren. */
|
|||
|
|
|||
|
if (pers != cp->pers)
|
|||
|
{
|
|||
|
setstring(&(cp->pers), pers, 256); /* Neuen Pers-Text setzen. */
|
|||
|
cp->mtime = currtime; /* Aktuelle Zeit merken. */
|
|||
|
|
|||
|
sprintf(buffer, ":%s 311 %s %s %s %s * :%s\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname
|
|||
|
, cp->name
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, cp->host
|
|||
|
, (*pers && *pers != '@') ? pers : "");
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
#ifndef CONVNICK
|
|||
|
send_persmsg(cp->name, /* Neuen Pers-Text an andere HOST's weiterleiten.*/
|
|||
|
myhostname,
|
|||
|
cp->channel,
|
|||
|
pers,
|
|||
|
cp->time);
|
|||
|
#else
|
|||
|
send_persmsg(cp->name, /* Neuen Pers-Text an andere HOST's weiterleiten.*/
|
|||
|
cp->nickname,
|
|||
|
myhostname,
|
|||
|
cp->channel,
|
|||
|
pers,
|
|||
|
cp->time);
|
|||
|
#endif /* CONVNICK */
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void IrcNoticeCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[2048];
|
|||
|
int channel;
|
|||
|
char *toname, *text;
|
|||
|
CHANNEL *ch;
|
|||
|
CLIST *cl;
|
|||
|
char *q;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcNoticeCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
*buffer = 0;
|
|||
|
|
|||
|
toname = getarg(0, 0);
|
|||
|
if (*toname && (*toname == '#' || *toname == '~'))
|
|||
|
toname++;
|
|||
|
|
|||
|
// notice commands should not be answered
|
|||
|
if (!*toname)
|
|||
|
return;
|
|||
|
|
|||
|
text = getarg(NULL, GET_ALL);
|
|||
|
|
|||
|
cp->locked = 1;
|
|||
|
|
|||
|
if (*text == ':')
|
|||
|
text++;
|
|||
|
// dcc mess
|
|||
|
|
|||
|
if ((q = strchr(text, '\001')))
|
|||
|
{
|
|||
|
text = q+1;
|
|||
|
if ((q = strchr(text, '\001')))
|
|||
|
*q = 0;
|
|||
|
|
|||
|
if (!strncasecmp(text, "AWAY ", 5))
|
|||
|
{
|
|||
|
text = text+5;
|
|||
|
|
|||
|
while (*text && isspace(*text & 0xff))
|
|||
|
text++;
|
|||
|
|
|||
|
if (strcmp(cp->away, text))
|
|||
|
send_awaymsg(cp->name, cp->nickname, myhostname, currtime, text);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!strncasecmp(text, "ACTION ", 7))
|
|||
|
{
|
|||
|
text = text+7;
|
|||
|
|
|||
|
while (*text && isspace(*text & 0xff))
|
|||
|
text++;
|
|||
|
|
|||
|
if (strlen(text) > 384)
|
|||
|
text[384] = 0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
while (*text && isspace(*text & 0xff))
|
|||
|
text++;
|
|||
|
|
|||
|
if (strlen(text) > 384)
|
|||
|
text[384] = 0;
|
|||
|
|
|||
|
sprintf(buffer, "*** %s@%s ack :%s:", cp->name, cp->host, text);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!*buffer)
|
|||
|
sprintf(buffer, "*** %s@%s notice: %s", cp->name, cp->host, text);
|
|||
|
|
|||
|
if (isdigit(*toname & 0xff) && ((channel = atoi(toname)) > 0 || (channel == 0 && !strcmp(toname, "0"))))
|
|||
|
{
|
|||
|
// to channel. special care must be taken
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
if (ch->chan == channel)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (!ch)
|
|||
|
return;
|
|||
|
|
|||
|
// only channels we are on (and have permission to talk)
|
|||
|
if (cp->operator == 2)
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
else
|
|||
|
if (cp->channel == ch->chan)
|
|||
|
{
|
|||
|
if ((ch->flags & M_CHAN_M) && !cp->channelop)
|
|||
|
return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
for (cl = cp->chan_list; cl; cl = cl->next)
|
|||
|
if (cl->channel == ch->chan)
|
|||
|
break;
|
|||
|
|
|||
|
if (!cl)
|
|||
|
return;
|
|||
|
|
|||
|
if ((ch->flags & M_CHAN_M) && !cl->channelop)
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
send_msg_to_channel("conversd", (short)channel, buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
send_msg_to_user("conversd", toname, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void IrcChannelCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *chan;
|
|||
|
char buffer[2048];
|
|||
|
WORD newchannel;
|
|||
|
struct channel *ch;
|
|||
|
struct clist *cl,
|
|||
|
*cl2;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcChannelCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
/* Channel holen. */
|
|||
|
chan = getarg(NULL, GET_NXTLC);
|
|||
|
|
|||
|
if (*chan == '#')
|
|||
|
chan++;
|
|||
|
|
|||
|
newchannel = atoi(chan);
|
|||
|
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
if (ch->chan == newchannel)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
for (cl = cp->chan_list; cl; cl = cl->next)
|
|||
|
{
|
|||
|
if (cl->channel == newchannel)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
/* Gibt es einen Eintrag? */
|
|||
|
if (cl)
|
|||
|
/* Ja, */
|
|||
|
return;
|
|||
|
|
|||
|
#ifdef CONVNICK
|
|||
|
send_user_change_msg(cp->name,cp->nickname, cp->host, -1, newchannel, cp->pers, cp->time);
|
|||
|
#else
|
|||
|
send_user_change_msg(cp->name,cp->host, -1, newchannel, cp->pers, cp->time);
|
|||
|
#endif /* CONV_NICKNAME */
|
|||
|
|
|||
|
if (!ch)
|
|||
|
cp->locked = 0;
|
|||
|
|
|||
|
cl = (CLIST *)calloc(1, sizeof(CLIST));
|
|||
|
cl->time = currtime;
|
|||
|
cp->mtime = currtime;
|
|||
|
|
|||
|
if (!ch)
|
|||
|
cl->channelop = 1;
|
|||
|
else
|
|||
|
cl->channelop = 0;
|
|||
|
|
|||
|
cl->channel = newchannel;
|
|||
|
|
|||
|
if (!cp->chan_list || cp->chan_list->channel > cl->channel)
|
|||
|
{
|
|||
|
cl->next = cp->chan_list;
|
|||
|
cp->chan_list = cl;
|
|||
|
}
|
|||
|
else
|
|||
|
for (cl2 = cp->chan_list; cl2; cl2 = cl2->next)
|
|||
|
{
|
|||
|
if (cl2->next)
|
|||
|
{
|
|||
|
if (cl2->next->channel > atoi(chan))
|
|||
|
{
|
|||
|
cl->next = cl2->next;
|
|||
|
cl2->next = cl;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
cl2->next = cl;
|
|||
|
cl->next = NULLCLIST;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cp->channel = atoi(chan);
|
|||
|
|
|||
|
sprintf(buffer,":%s!%s@%s JOIN :#%d\n"
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, cp->name
|
|||
|
, cp->host
|
|||
|
, cp->channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s MODE #%d +%s\n"
|
|||
|
,myhostname
|
|||
|
,cp->channel
|
|||
|
,get_mode_flags2irc((ch ? ch->flags : 0)));
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
IrcNamesCommand(cp);
|
|||
|
|
|||
|
if (ch)
|
|||
|
{
|
|||
|
if (ch->topic)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 332 %s #%d :%s\n"
|
|||
|
,cp->host
|
|||
|
,(*cp->nickname ? cp->nickname : cp->name)
|
|||
|
,cp->channel
|
|||
|
,ch->topic);
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s 333 %s #%d %s %ld\n"
|
|||
|
, cp->host
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, cp->channel
|
|||
|
, ch->name
|
|||
|
, ch->time);
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
cp->channelop = cl->channelop;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Mode einstellen. */
|
|||
|
void IrcModeCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
CONNECTION *p;
|
|||
|
CHANNEL *ch;
|
|||
|
CLIST *cl;
|
|||
|
char buffer[2048];
|
|||
|
char *arg,
|
|||
|
*c;
|
|||
|
int remove = 0;
|
|||
|
int channel = 0;
|
|||
|
int oldflags = 0;
|
|||
|
int op = 0;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcModeCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
arg = getarg(0, 0);
|
|||
|
|
|||
|
if (*arg == ':')
|
|||
|
arg++;
|
|||
|
|
|||
|
if (*arg == '#')
|
|||
|
arg++;
|
|||
|
else
|
|||
|
{
|
|||
|
if (cp->IrcMode)
|
|||
|
{
|
|||
|
if (!strcmp(arg, "*"))
|
|||
|
return;
|
|||
|
|
|||
|
if (cp->type == CT_USER)
|
|||
|
{
|
|||
|
char *arg2 = getarg(0, 0);
|
|||
|
|
|||
|
if (!*arg)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 461 %s MODE :Not enough parameters\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name));
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (strcasecmp(arg, cp->nickname))
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 403 %s %s :No such channel\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, arg);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
*buffer = 0;
|
|||
|
|
|||
|
if (!*arg2)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 211 %s %s\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname
|
|||
|
, (cp->verbose) ? "+sw" : "");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (strstr(arg2, "+s") || strstr(arg2, "+w"))
|
|||
|
cp->verbose = 1;
|
|||
|
else
|
|||
|
if (strstr(arg2, "-s") || strstr(arg2, "-w"))
|
|||
|
cp->verbose = 0;
|
|||
|
else
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 501 %s :Unknown MODE flag: %s\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, arg2);
|
|||
|
}
|
|||
|
|
|||
|
if (!*buffer)
|
|||
|
sprintf(buffer, ":%s MODE %s %csw\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname
|
|||
|
, (cp->verbose ? '+' : '-'));
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
channel = atoi(arg);
|
|||
|
|
|||
|
if (*arg && !strcmp(arg, "*"))
|
|||
|
{
|
|||
|
channel = cp->channel;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!*arg || !(isdigit(*arg & 0xff) && (channel > 0 || (!channel && !strcmp(arg, "0")))))
|
|||
|
{
|
|||
|
if (cp->type != CT_HOST)
|
|||
|
{
|
|||
|
if (*arg)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 403 %s #%s :No such channel\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, arg);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 461 %s MODE :Not enough parameters\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name));
|
|||
|
}
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
appendprompt(cp, 0);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
arg = getarg(0, 1);
|
|||
|
|
|||
|
if (!*arg && cp->type == CT_USER)
|
|||
|
{
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
if (ch->chan == channel)
|
|||
|
break;
|
|||
|
/*
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 324 %s %s #%d +%s\n"
|
|||
|
, cp->host
|
|||
|
, cp->name
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel
|
|||
|
, get_mode_flags2irc(ch->flags));
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s 329 %s %s #%d %d\n"
|
|||
|
, cp->host
|
|||
|
, cp->name
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel
|
|||
|
, 0);
|
|||
|
appendstring(cp, buffer);
|
|||
|
appendprompt(cp, 0);
|
|||
|
break;
|
|||
|
}*/
|
|||
|
}
|
|||
|
|
|||
|
if (!ch)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 403 %s #%d :No such channel\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
appendprompt(cp, 0);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
for (cl = cp->chan_list; cl; cl = cl->next)
|
|||
|
{
|
|||
|
if (cl->channel == channel)
|
|||
|
{
|
|||
|
if (cl->channelop)
|
|||
|
op++;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
if (channel == ch->chan)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (op || cp->operator == 2 || (cp->type == CT_HOST))
|
|||
|
{
|
|||
|
if (!ch || (cp->type != CT_HOST && channel == 0 && cp->operator != 2))
|
|||
|
{
|
|||
|
if (cp->type == CT_USER)
|
|||
|
{
|
|||
|
if (channel == 0)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 477 %s #%d :Channel doesn't support modes\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 403 %s #%d :No such channel\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (cp->type == CT_USER)
|
|||
|
return;
|
|||
|
|
|||
|
oldflags = ch->flags;
|
|||
|
|
|||
|
while (*arg)
|
|||
|
{
|
|||
|
switch (*arg)
|
|||
|
{
|
|||
|
case '+':
|
|||
|
{
|
|||
|
remove = 0;
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case '-':
|
|||
|
{
|
|||
|
remove = 1;
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'S':
|
|||
|
case 's':
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_S);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_I);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_S;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_I;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'P':
|
|||
|
case 'p':
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_P);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_S);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_P;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_S;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'T':
|
|||
|
case 't':
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_T);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_T;
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'I':
|
|||
|
case 'i':
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_I);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_P);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_I;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_P;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'L':
|
|||
|
case 'l':
|
|||
|
{
|
|||
|
if (!cp->IrcMode)
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_L);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_L;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 472 %s %c :is unknown mode char to me\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, *arg);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'M':
|
|||
|
case 'm':
|
|||
|
{
|
|||
|
if (remove && ch)
|
|||
|
{
|
|||
|
ch->flags -= (ch->flags & M_CHAN_M);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ch->flags |= M_CHAN_M;
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'O':
|
|||
|
case 'o':
|
|||
|
{
|
|||
|
arg++;
|
|||
|
while (*arg)
|
|||
|
{
|
|||
|
CONNECTION *p_found = 0;
|
|||
|
int status_really_changed = 0;
|
|||
|
char *fromname = cp->name;
|
|||
|
char *fromnickname = (cp->type == CT_HOST ? cp->name : cp->nickname);
|
|||
|
int user_found = 0;
|
|||
|
|
|||
|
while (*arg == ' ')
|
|||
|
arg++;
|
|||
|
|
|||
|
if (*arg == ':')
|
|||
|
arg++;
|
|||
|
|
|||
|
c = arg;
|
|||
|
|
|||
|
while (*c != ' ')
|
|||
|
{
|
|||
|
if (*c != '\0')
|
|||
|
{
|
|||
|
c++;
|
|||
|
}
|
|||
|
else
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (*c != '\0')
|
|||
|
{
|
|||
|
*c++ = '\0';
|
|||
|
}
|
|||
|
|
|||
|
if (cp->type != CT_HOST && channel < 0 )
|
|||
|
continue;
|
|||
|
|
|||
|
clear_locks();
|
|||
|
|
|||
|
if (cp->type == CT_HOST)
|
|||
|
cp->locked = 1;
|
|||
|
|
|||
|
for (p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
if (p->type != CT_USER)
|
|||
|
continue;
|
|||
|
|
|||
|
if (!(!strcasecmp(p->name, arg) || (cp->type == CT_USER && !strcasecmp(p->nickname, arg))))
|
|||
|
continue;
|
|||
|
|
|||
|
user_found = 1;
|
|||
|
|
|||
|
if (channel == -1)
|
|||
|
{
|
|||
|
if (!p_found || !p->operator)
|
|||
|
p_found = p;
|
|||
|
|
|||
|
if (!status_really_changed)
|
|||
|
{
|
|||
|
status_really_changed = (p->operator == 0);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (p->channel == channel)
|
|||
|
{
|
|||
|
if (!p_found || !p->channelop)
|
|||
|
p_found = p;
|
|||
|
|
|||
|
if (!status_really_changed)
|
|||
|
status_really_changed = (p->channelop == 0);
|
|||
|
|
|||
|
p->channelop = 1;
|
|||
|
}
|
|||
|
|
|||
|
for (cl = p->chan_list; cl; cl = cl->next)
|
|||
|
{
|
|||
|
if (cl->channel == p->channel)
|
|||
|
{
|
|||
|
if (!p_found || !p->channelop)
|
|||
|
p_found = p;
|
|||
|
|
|||
|
if (!status_really_changed)
|
|||
|
status_really_changed = (cl->channelop == 0);
|
|||
|
|
|||
|
cl->channelop = 1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (p_found)
|
|||
|
{
|
|||
|
send_opermsg(fromnickname, p_found->host, fromname, (WORD)channel, 0);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (cp->type == CT_USER)
|
|||
|
{
|
|||
|
if (cp->IrcMode)
|
|||
|
{
|
|||
|
if (user_found)
|
|||
|
sprintf(buffer, ":%s 441 %s %s #%d :They aren't on that channel\n"
|
|||
|
, cp->host
|
|||
|
, cp->nickname
|
|||
|
, arg
|
|||
|
, channel);
|
|||
|
else
|
|||
|
sprintf(buffer, ":%s 401 %s %s :No such nick\n"
|
|||
|
, cp->host
|
|||
|
, cp->nickname
|
|||
|
, arg);
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (user_found)
|
|||
|
sprintf(buffer, "*** User not in channel: %s.\n"
|
|||
|
, arg);
|
|||
|
else
|
|||
|
sprintf(buffer, "*** No such user: %s.\n"
|
|||
|
, arg);
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cp->locked = 1;
|
|||
|
arg = c;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
case 'N':
|
|||
|
case 'B':
|
|||
|
case 'b':
|
|||
|
case 'V':
|
|||
|
case 'v':
|
|||
|
case 'K':
|
|||
|
case 'k':
|
|||
|
case 'W':
|
|||
|
case 'w':
|
|||
|
{
|
|||
|
if (cp->IrcMode)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 472 %s :Unknown MODE flag (%c).\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, *arg);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case 'n':
|
|||
|
default:
|
|||
|
{
|
|||
|
arg++;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (ch && (ch->flags != oldflags))
|
|||
|
{
|
|||
|
clear_locks(); // send_opermsg may have locked it..
|
|||
|
cp->locked = 1;
|
|||
|
|
|||
|
if (cp->type == CT_USER && !cp->IrcMode)
|
|||
|
{
|
|||
|
appendstring(cp, "*** Flags: ");
|
|||
|
// appendstring(cp, get_mode_flags(ch->flags));
|
|||
|
appendstring(cp, "\n");
|
|||
|
}
|
|||
|
|
|||
|
//send_mode(cp, ch, oldflags);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//else
|
|||
|
{
|
|||
|
if (!ch || ((ch->flags & M_CHAN_S || ch->flags & M_CHAN_I) && !(cp->operator == 2 || cl)))
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 403 %s #%d :No such channel\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 482 %s #%d :You're not channel operator\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, channel);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (cp->type == CT_USER)
|
|||
|
{
|
|||
|
appendprompt(cp, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* Private MSG verschicken. */
|
|||
|
void IrcPrivmsgCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcPrivmsgCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
msg_command(cp);
|
|||
|
}
|
|||
|
|
|||
|
/* Channel schliessen. */
|
|||
|
void IrcPartCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcPartCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
leave_command(cp);
|
|||
|
}
|
|||
|
|
|||
|
/* Help Kommando */
|
|||
|
void IrcHelpCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcHelpCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
help_command(cp);
|
|||
|
}
|
|||
|
|
|||
|
/* Quit Kommando */
|
|||
|
void IrcQuitCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcQuitCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
bye_command(cp);
|
|||
|
}
|
|||
|
|
|||
|
void IrcPingCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *arg;
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcPingCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
arg = getarg(0, 0);
|
|||
|
|
|||
|
arg[cp->width] = 0;
|
|||
|
|
|||
|
sprintf(buffer, ":%s PONG %s :%s\n", myhostname, myhostname, arg);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
void IrcPongCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[1024];
|
|||
|
char *line;
|
|||
|
time_t response_time = 0L;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcPongCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
line = getarg(0, 0);
|
|||
|
|
|||
|
if (*line == ':')
|
|||
|
line++;
|
|||
|
|
|||
|
if (isalpha(*line))
|
|||
|
{
|
|||
|
sprintf(buffer, "PING :%ld\n", currtime);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
sscanf(line, "%ld", &response_time);
|
|||
|
|
|||
|
if (response_time < 1L)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 375 %s bad answer, sorry\n"
|
|||
|
, myhostname
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name));
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
ts2();
|
|||
|
sprintf(buffer, ":%s 375 %s *** rtt %s <-> %s is %s\n"
|
|||
|
, myhostname
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, myhostname
|
|||
|
, (*cp->name ? cp->name : "you")
|
|||
|
, ts4(currtime - response_time));
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
appendprompt(cp, 0);
|
|||
|
}
|
|||
|
|
|||
|
/* Alle User auf den aktuellen Channel bereitstellen. */
|
|||
|
void IrcNamesCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
CONNECTION *p;
|
|||
|
CHANNEL *ch;
|
|||
|
CLIST *cl2;
|
|||
|
char buffer[BUFSIZ];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcNamesCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer,":%s 353 %s = #%d :"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,cp->channel);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
/* Aktueller Channel? */
|
|||
|
if (ch->chan != cp->channel)
|
|||
|
/* Nein, zum naechsten. */
|
|||
|
continue;
|
|||
|
|
|||
|
for (p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
/* Nur angemeldete User. */
|
|||
|
if (p->type == CT_USER)
|
|||
|
{
|
|||
|
/* if (ch->chan != cp->channel)
|
|||
|
break;*/
|
|||
|
/* User im gesuchten Channel. */
|
|||
|
if (p->channel != ch->chan)
|
|||
|
{
|
|||
|
/* Nein, dann suchen wir in der Channel-List. */
|
|||
|
for (cl2 = p->chan_list; cl2; cl2 = cl2->next)
|
|||
|
{
|
|||
|
/* User im gesuchten Channel. */
|
|||
|
if (cl2->channel == ch->chan)
|
|||
|
/* Eintrag gefunden. */
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
/* Kein Eintrag gefunden? */
|
|||
|
if (!cl2)
|
|||
|
/* Dann zum naechsten. */
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
/* Username - IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, "%s%s "
|
|||
|
,(p->channelop ? "@" : "")
|
|||
|
, (*p->nickname ? p->nickname : p->name));
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/* LISTENDE - IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, "\n:%s 366 %s #%d\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,cp->channel);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* Auflistung aller User im angegebenen Kanal. */
|
|||
|
void IrcWhoCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
CONNECTION *p;
|
|||
|
CHANNEL *ch;
|
|||
|
CLIST *cl2;
|
|||
|
char buffer[BUFSIZ];
|
|||
|
char *chan;
|
|||
|
WORD Channel;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcWhoCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
/* Gesuchten Channel holen. */
|
|||
|
chan = getarg(NULL, GET_NXTLC);
|
|||
|
|
|||
|
/* 1. Zeichen eine "#"? */
|
|||
|
if (*chan == '#')
|
|||
|
/* "#" entfernen. */
|
|||
|
chan++;
|
|||
|
|
|||
|
Channel = atoi(chan);
|
|||
|
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
for (p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
/* Nur angemeldete User. */
|
|||
|
if (p->type == CT_USER)
|
|||
|
{
|
|||
|
/* Unser Channel? */
|
|||
|
if (ch->chan != Channel)
|
|||
|
/* Zum naechsten. */
|
|||
|
break;
|
|||
|
|
|||
|
/* Hat unser User den gesuchten Channel? */
|
|||
|
if (p->channel != ch->chan)
|
|||
|
{
|
|||
|
/* Nein, dann schauen wir noch in die Channel-Liste. */
|
|||
|
for (cl2 = p->chan_list; cl2; cl2 = cl2->next)
|
|||
|
{
|
|||
|
/* Hat unser User den gesuchten Channel? */
|
|||
|
if (cl2->channel == ch->chan)
|
|||
|
/* Channel gefunden. */
|
|||
|
break;
|
|||
|
}
|
|||
|
/* Eintrag gefunden. */
|
|||
|
if (!cl2)
|
|||
|
/* Nein, weitersuchen. */
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer,":%s 352 %s %d %s%s %s %s %s %s%s%s :%d %s\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->channel
|
|||
|
,""
|
|||
|
,p->name
|
|||
|
,p->host
|
|||
|
,p->host
|
|||
|
,p->nickname
|
|||
|
,(p->away ? "G" : "H")
|
|||
|
,""
|
|||
|
,(p->operator ? "@" : "")
|
|||
|
,0
|
|||
|
,(p->pers ? p->pers : ""));
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* LISTENDE - IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 315 %s #%s\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,chan);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
|
|||
|
void IrcLinksCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
DESTINATION *d;
|
|||
|
char buffer[2048];
|
|||
|
char *dest = 0;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcLinksCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
if (cp->type == CT_USER)
|
|||
|
dest = getarg(0, 0);
|
|||
|
else
|
|||
|
dest = "";
|
|||
|
|
|||
|
if (*dest == '\0')
|
|||
|
{
|
|||
|
for (d = destinations; d; d = d->next)
|
|||
|
{
|
|||
|
if (d->rtt)
|
|||
|
{
|
|||
|
if (d->name[0] == FALSE)
|
|||
|
continue;
|
|||
|
|
|||
|
sprintf(buffer, ":%s 364 %s %s %s :%ld %s\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, d->name
|
|||
|
, (d->link->name ? d->link->name : myhostname)
|
|||
|
, d->rtt
|
|||
|
, d->rev);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, ":%s 364 %s %s %s :0 %s\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name)
|
|||
|
, cp->host
|
|||
|
, cp->host
|
|||
|
, "pp-3.14c");
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s 365 %s * :End of /LINKS list.\n"
|
|||
|
, cp->host
|
|||
|
, (cp->nickname ? cp->nickname : cp->name));
|
|||
|
appendstring(cp, buffer);
|
|||
|
appendprompt(cp, 0);
|
|||
|
}
|
|||
|
|
|||
|
/* Auflisten aller aktuellen Channels, Kanal, Useranzahl und Topic. */
|
|||
|
void IrcListCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
CHANNEL *ch;
|
|||
|
CONNECTION *p;
|
|||
|
CLIST *cl;
|
|||
|
char buffer[BUFSIZ];
|
|||
|
int n;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcListCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
{
|
|||
|
/* Userzaehler auf 0 setzen. */
|
|||
|
n = 0;
|
|||
|
for (p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
/* Nur angemeldete User. */
|
|||
|
if (p->type == CT_USER)
|
|||
|
{
|
|||
|
if (p->channel == ch->chan)
|
|||
|
/* Userzaehler um eins hoeher. */
|
|||
|
n++;
|
|||
|
else
|
|||
|
{
|
|||
|
for (cl = p->chan_list; cl; cl = cl->next)
|
|||
|
/* Hat unser User den gesuchten Channel? */
|
|||
|
if (cl->channel == ch->chan)
|
|||
|
/* Channel gefunden. */
|
|||
|
break;
|
|||
|
|
|||
|
/* Eintrag gefunden? */
|
|||
|
if (cl)
|
|||
|
/* Userzaehler um eins hoeher. */
|
|||
|
n++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 322 %s #%d %d :%s\n"
|
|||
|
,cp->host
|
|||
|
,(*cp->nickname ? cp->nickname : cp->name)
|
|||
|
,ch->chan
|
|||
|
,n
|
|||
|
,(ch->topic ? ch->topic : ""));
|
|||
|
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* LISTENDE - IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 323 %s\n"
|
|||
|
,cp->host
|
|||
|
,(*cp->nickname ? cp->nickname : cp->name));
|
|||
|
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* Informationen eines Users. */
|
|||
|
void IrcWhoisCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[BUFSIZ];
|
|||
|
char *username;
|
|||
|
char *revision;
|
|||
|
CONNECTION *p, *c;
|
|||
|
CHANNEL *ch;
|
|||
|
DESTINATION *d;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcWhoisCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
/* Username holen. */
|
|||
|
username = getarg(0, 1);
|
|||
|
|
|||
|
for (p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
/* User angemeldet. */
|
|||
|
if (p->type == CT_USER)
|
|||
|
{
|
|||
|
/* Gesuchter Username? */
|
|||
|
if ( (strcmp(p->name, username) == FALSE)
|
|||
|
||(strcmp(p->nickname, username) == FALSE))
|
|||
|
{
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 311 %s %s %s%s %s * :%s%s\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->nickname
|
|||
|
,""
|
|||
|
,p->name
|
|||
|
,p->host
|
|||
|
,(p->pers ? p->pers : "")
|
|||
|
,(p->pers == "~" ? " [NonAuth]" : ""));
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
|
|||
|
/* User als Sysop angemeldet. */
|
|||
|
if (p->operator)
|
|||
|
{
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 313 %s %s :is an IRC operator\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->nickname);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
|
|||
|
for (c = connections; c; c = c->next)
|
|||
|
{
|
|||
|
/* Nur angemeldete User. */
|
|||
|
if (c->type != CT_USER)
|
|||
|
/* Ein unangemeldeter oder HOST, zum naechsten. */
|
|||
|
continue;
|
|||
|
|
|||
|
/* Vergleiche Username. */
|
|||
|
if (strcmp(p->name, c->name))
|
|||
|
/* Nicht unser gesuchter Username, zum naechten. */
|
|||
|
continue;
|
|||
|
|
|||
|
/* Aktuellen Channel suchen. */
|
|||
|
for (ch = channels; ch; ch = ch->next)
|
|||
|
if (ch->chan == c->channel)
|
|||
|
/* gefunden. */
|
|||
|
break;
|
|||
|
|
|||
|
/* IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 319 %s %s :%s %d \n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->nickname
|
|||
|
,(c->channelop ? "@" : "")
|
|||
|
,c->channel);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* User eigner Knoten. */
|
|||
|
if (!strcasecmp(p->host, myhostname))
|
|||
|
/* Markieren wir die Revision, */
|
|||
|
revision = strchr(REV, ':')+2;
|
|||
|
|
|||
|
/* Pruefe alle Destinationen. */
|
|||
|
for (d = destinations; d; d = d->next)
|
|||
|
/* Vergleiche Hostname. */
|
|||
|
if (!strcasecmp(d->name, p->host))
|
|||
|
/* gefunden. */
|
|||
|
break;
|
|||
|
|
|||
|
/* Revision, IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 312 %s %s %s :%s\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->nickname
|
|||
|
,p->host
|
|||
|
,(d ? d->rev : revision));
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
|
|||
|
/* Online, IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 317 %s %s %ld %ld :seconds idle, signon time\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,p->nickname
|
|||
|
,(currtime - p->mtime), p->time);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* LISTENDE - IRC-Meldung vorbereiten. */
|
|||
|
sprintf(buffer, ":%s 318 %s %s\n"
|
|||
|
,myhostname
|
|||
|
,cp->nickname
|
|||
|
,username);
|
|||
|
/* Und abschicken. */
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
|
|||
|
/* Username aufloesen. */
|
|||
|
void IrcUserCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *user, *pers;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcUserCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
/* User erstmal sperren .*/
|
|||
|
cp->locked = 1;
|
|||
|
/* Kanal wird spaeter gesetzt. */
|
|||
|
cp->channel = EOF;
|
|||
|
|
|||
|
/* Ist es ein Host, ist der hier verkehrt. */
|
|||
|
if (cp->type == CT_HOST)
|
|||
|
/* Und weg damit. */
|
|||
|
return;
|
|||
|
|
|||
|
/* Username holfen. */
|
|||
|
user = getarg(0, 0);
|
|||
|
|
|||
|
/* Personal Text einlesen & speichern. */
|
|||
|
personalmanager(SET, cp, (pers = getarg(NULL, GET_ALL)));
|
|||
|
/* Personal Text setzen, max. zeichen 256!. */
|
|||
|
setstring(&(cp->pers), pers, 256);
|
|||
|
|
|||
|
/* Username sichern. */
|
|||
|
strncpy(cp->name, user, NAMESIZE + 1);
|
|||
|
|
|||
|
/* Verbose, defaultwert setzen. */
|
|||
|
cp->verbose = 0;
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Gibt Informationen ueber die Anzahl von Verbindungen, Global und Lokal. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
static void IrcLusersCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[2048];
|
|||
|
DESTINATION *d;
|
|||
|
CHANNEL *ch;
|
|||
|
CONNECTION *p;
|
|||
|
int n_users = 0; /* Useranzahl. */
|
|||
|
int n_dest, /* Destination/Routen. */
|
|||
|
n_channels, /* Kanalanzahl. */
|
|||
|
n_clients, /* IRC-Client. */
|
|||
|
n_servers, /* IRC-Server. */
|
|||
|
n_operators, /* Operatoranzahl. */
|
|||
|
n_typeunknown; /* Unbekannt. */
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcLusersCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
for (n_dest = 0, d = destinations; d; d = d->next) /* Dest/Routen zaehlen. */
|
|||
|
{
|
|||
|
if (d->rtt && d->link) /* Dest/Route gefunden. */
|
|||
|
n_dest++; /* um eins erhoehen. */
|
|||
|
}
|
|||
|
|
|||
|
for (n_channels = 0, ch = channels; ch; ch = ch->next) /* Kanaele zaehlen. */
|
|||
|
{
|
|||
|
if (!(ch->flags & M_CHAN_I)) /* keine unsichtbaren kanaele zaehlen. */
|
|||
|
n_channels++; /* um eins erhoehen. */
|
|||
|
}
|
|||
|
|
|||
|
for (n_clients = n_servers = n_typeunknown = n_operators = 0, p = connections; p; p = p->next)
|
|||
|
{
|
|||
|
switch (p->type)
|
|||
|
{
|
|||
|
case CT_HOST:
|
|||
|
n_servers++;
|
|||
|
break;
|
|||
|
|
|||
|
case CT_USER:
|
|||
|
n_users++;
|
|||
|
|
|||
|
if (!p->via)
|
|||
|
n_clients++;
|
|||
|
|
|||
|
if (p->operator)
|
|||
|
n_operators++;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case CT_UNKNOWN:
|
|||
|
default:
|
|||
|
n_typeunknown++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, ":%s 251 %s :Hier sind %d User auf %d Server\n", myhostname, cp->nickname, n_users, (n_dest) ? n_dest+1 : 1) ;
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
if (n_operators)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 252 %s %d Sysop%s online\n", myhostname, cp->nickname, n_operators, (n_operators != 1) ? "s" : "");
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
if (n_typeunknown)
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 253 %s %d :Ungueltige Verbindung%s\n", myhostname, cp->nickname, n_typeunknown, (n_typeunknown != 1) ? "en" : "");
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, ":%s 254 %s %d :Kanael%s\n", myhostname, cp->nickname, n_channels, (n_channels != 1 ? "e" : ""));
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s 255 %s :Ich habe %d client%s auf %d Server\n", myhostname, cp->nickname, n_clients, (n_clients != 1) ? "s" : "", n_servers);
|
|||
|
appendstring(cp, buffer);
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Zusaetzlich Text an IRC-Client senden. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
static void IrcMotdCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
FILE *fp;
|
|||
|
char motdfile[MAXPATH + 1];
|
|||
|
char buffer[80 + 1];
|
|||
|
char buffer2[128];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcMotdCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
strcpy(motdfile, confpath);
|
|||
|
strcat(motdfile, IRC_TXT);
|
|||
|
|
|||
|
if ((fp = xfopen(motdfile, "r")) == NULL) /* Fehler beim oeffnen. */
|
|||
|
return; /* Abbrechen. */
|
|||
|
|
|||
|
sprintf(buffer2, ":%s 372 %s :"
|
|||
|
, myhostname
|
|||
|
, cp->nickname);
|
|||
|
|
|||
|
while (fgets(buffer, 80, fp)) /* Maximal 80 Zeichen einlesen. */
|
|||
|
{
|
|||
|
appendstring(cp, buffer2); /* Code-String. */
|
|||
|
appendstring(cp, buffer); /* Datei einlesen. */
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, "\n:%s 376 %s :\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname);
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
fclose(fp); /* Datei schliessen. */
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* IRC-Client anmelden. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
static void IrcLogin(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcLogin)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
cp->charset_in = cp->charset_out = ISO_STRIPED;
|
|||
|
|
|||
|
sprintf(buffer, ":%s 001 %s :%s @ %s PingPong-Release %5.5s (TNN) - Type /HELP for help.\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname
|
|||
|
, convtype
|
|||
|
, myhostname
|
|||
|
, strchr(REV, ':')+2);
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
sprintf(buffer, ":%s 004 %s %s :\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname
|
|||
|
, myhostname);
|
|||
|
|
|||
|
appendstring(cp, buffer);
|
|||
|
|
|||
|
IrcLusersCommand(cp); /* Anzahl User, Server, Kanaele etc. ausgeben. */
|
|||
|
IrcMotdCommand(cp); /* Zusaetzlichen Text ausgeben (irc.txt). */
|
|||
|
|
|||
|
cp->width = 80; /* Zeilengrenze setzen .*/
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Nickname aufloesen. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcNickCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char *arg;
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcNickCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
arg = getarg(0, 0); /* Nickname einlesen. */
|
|||
|
|
|||
|
if (cp->type == CT_HOST) /* Host ? */
|
|||
|
return; /* Und weg damit. */
|
|||
|
|
|||
|
if (cp->away != NULL) /* Wenn ein Away-Text gesetzt ist, */
|
|||
|
{
|
|||
|
cp->away = NULL; /* zuruecksetzen. */
|
|||
|
|
|||
|
#ifndef CONVNICK
|
|||
|
send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */
|
|||
|
cp->hosthostname,
|
|||
|
currtime,
|
|||
|
cp->away);
|
|||
|
#else
|
|||
|
send_awaymsg(cp->name, /* Neuen Away-Text an andere Host's weiterleiten. */
|
|||
|
cp->nickname,
|
|||
|
cp->host,
|
|||
|
currtime,
|
|||
|
cp->away);
|
|||
|
#endif /* CONVNICK */
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (*arg == ':') /* Gibt es ":" im string? */
|
|||
|
arg++; /* ":" loeschen. */
|
|||
|
|
|||
|
if (!*arg) /* String leer? */
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 431 * :Kein Nickname angegeben!\n"
|
|||
|
, myhostname);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef CONV_CHECK_USER
|
|||
|
{
|
|||
|
CONNECTION *pP;
|
|||
|
|
|||
|
if ((pP = CheckUserCVS(arg)) != NULL) /* Pruefung auf Doppel-Login. */
|
|||
|
{ /* Kein Login moeglich. */
|
|||
|
sprintf(buffer, ":%s 433 %s %s :Nickname already in use\n"
|
|||
|
, myhostname
|
|||
|
, (*cp->nickname ? cp->nickname : "*")
|
|||
|
, arg);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
#endif /* CONV_CHECK_USER */
|
|||
|
|
|||
|
if (*cp->nickname) /* Schon eingeloggt. */
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s!%s@%s NICK :%s\n" /* Meldung abschicken. */
|
|||
|
, cp->nickname
|
|||
|
, cp->name
|
|||
|
, myhostname
|
|||
|
, arg);
|
|||
|
appendstring(cp, buffer); /* Meldung abschicken. */
|
|||
|
|
|||
|
strncpy(cp->OldNickname, cp->nickname, NAMESIZE);/* Alten Nick eintragen. */
|
|||
|
cp->nickname[NAMESIZE] = 0;
|
|||
|
|
|||
|
strncpy(cp->nickname, arg, NAMESIZE); /* Neuen Nick eintragen. */
|
|||
|
cp->nickname[NAMESIZE] = 0;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
strncpy(cp->nickname, arg, NAMESIZE); /* Nick eintragen. */
|
|||
|
cp->nickname[NAMESIZE] = 0;
|
|||
|
|
|||
|
if (!*cp->name) /* Noch kein Username bekannt? */
|
|||
|
{
|
|||
|
strncpy(cp->name, arg, NAMESIZE + 1);/* Nehmen wir den Nickn als Username.*/
|
|||
|
cp->name[NAMESIZE + 1] = 0;
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, ":%s!%s@%s NICK :%s\r" /* IRC-Meldung vorbereiten. */
|
|||
|
, cp->nickname
|
|||
|
, cp->name
|
|||
|
, myhostname
|
|||
|
, arg);
|
|||
|
appendstring(cp, buffer); /* Und abschicken. */
|
|||
|
|
|||
|
strncpy(cp->host, myhostname, NAMESIZE); /* Hostname eintragen. */
|
|||
|
cp->host[sizeof(cp->host)-1] = 0;
|
|||
|
|
|||
|
cp->type = CT_USER; /* Als User markieren. */
|
|||
|
|
|||
|
IrcLogin(cp); /* IRC-Logintext. */
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Nickname an andere IRC-Client's weiterleiten. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void SendIrcNick(CONNECTION *p)
|
|||
|
{
|
|||
|
CONNECTION *p2;
|
|||
|
CLIST *cl,
|
|||
|
*cl2;
|
|||
|
char buffer[2048];
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(SendIrcNick)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
for (p2 = connections; p2; p2 = p2->next)
|
|||
|
{
|
|||
|
if (p2->locked) /* Sperre eingeschaltet. */
|
|||
|
continue; /* zum naechsten Eintrag. */
|
|||
|
|
|||
|
if (p2->type == CT_USER) /* Type User. */
|
|||
|
{
|
|||
|
if (p2 == p) /* mich selber nicht weitersagen. */
|
|||
|
continue; /* zum naechsten eintrag. */
|
|||
|
|
|||
|
if (p2->channel != p->channel) /* Kanal unterschiedlich. */
|
|||
|
{
|
|||
|
for (cl2 = p2->chan_list; cl2; cl2 = cl2->next)
|
|||
|
{
|
|||
|
if (cl2->channel == p->channel)
|
|||
|
break;
|
|||
|
else
|
|||
|
{
|
|||
|
for (cl = p->chan_list; cl; cl = cl->next)
|
|||
|
{
|
|||
|
if (cl->channel == cl2->channel)
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (p2->IrcMode == FALSE) /* Kein IRC-Client */
|
|||
|
continue; /* zum naechsten Eintrag. */
|
|||
|
/* Keine Aenderung, */
|
|||
|
if ( (!strncasecmp(p->OldNickname, p->nickname, NAMESIZE))
|
|||
|
||(!strncasecmp(p->name, p->nickname, NAMESIZE)))
|
|||
|
continue; /* zum naechsten Eintrag. */
|
|||
|
|
|||
|
/* Aktuellen Nick weitersagen. */
|
|||
|
sprintf(buffer, ":%s!%s@%s NICK %s\n"
|
|||
|
, (p->OldNickname[0] == FALSE ? p->name : p->OldNickname)
|
|||
|
, p->name
|
|||
|
, p->host
|
|||
|
, p->nickname);
|
|||
|
appenddirect(p2, buffer);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Informationen vom User ausgeben. . */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcUserHostCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
CONNECTION *p;
|
|||
|
char buffer[2048];
|
|||
|
char buffer2[2048];
|
|||
|
int found = 0;
|
|||
|
char *user;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcUserHostCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
user = getarg(0, 0); /* User einlesen. */
|
|||
|
|
|||
|
if (!*user) /* Kein User angegeben. */
|
|||
|
{ /* IRC-Meldung vorbereiten */
|
|||
|
sprintf(buffer, ":%s 461 %s USERHOST :Not enough parameters\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname);
|
|||
|
appendstring(cp, buffer); /* und abschicken. */
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer2, ":%s 302 %s :" /* IRC-Meldung vorbereiten */
|
|||
|
, myhostname
|
|||
|
, cp->nickname);
|
|||
|
|
|||
|
while (*user)
|
|||
|
{
|
|||
|
p = 0;
|
|||
|
if ( (!strcasecmp(cp->nickname, user)) /* Uservergleich mit Nick/Name. */
|
|||
|
||(!strcasecmp(cp->name, user)))
|
|||
|
p = cp; /* Eintrag gefunden. */
|
|||
|
else /* Kein Eintrag gefunden. */
|
|||
|
{
|
|||
|
for (p = connections; p; p = p->next) /* durchsuche convers-TBL. */
|
|||
|
{
|
|||
|
if ( (!strcasecmp(p->nickname, user))/* Uservergleich mit Nick/Name. */
|
|||
|
||(!strcasecmp(p->name, user)))
|
|||
|
break; /* Eintrag gefunden. */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!p) /* Kein User gefunden. */
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 401 %s %s :No such nick\n"
|
|||
|
, myhostname
|
|||
|
, (*cp->nickname ? cp->nickname : cp->name)
|
|||
|
, user);
|
|||
|
appendstring(cp,buffer);
|
|||
|
}
|
|||
|
else /* User gefunden. */
|
|||
|
{
|
|||
|
sprintf(buffer, "%s%s%s=%c%s%s@%s"
|
|||
|
, (found) ? " " : ""
|
|||
|
, (*p->nickname ? p->nickname : p->name)
|
|||
|
, (p->operator ? "*" : "")
|
|||
|
, (p->away ? '-' : '+')
|
|||
|
, ""
|
|||
|
, p->name
|
|||
|
, p->host);
|
|||
|
|
|||
|
if (strlen(buffer) + strlen(buffer2) > 510) /* Buf-laenge ueberschritten*/
|
|||
|
break; /* Abbrechen. */
|
|||
|
|
|||
|
strcat(buffer2, buffer); /* Informationen anhaengen. */
|
|||
|
|
|||
|
if (!found) /* Gibt noch keinen Eintrag. */
|
|||
|
found++; /* min. 1 Eintrag. */
|
|||
|
}
|
|||
|
|
|||
|
user = getarg(0, 0); /* Naechsten User einlesen. */
|
|||
|
}
|
|||
|
|
|||
|
if (found) /* Eintrag gefunden. */
|
|||
|
{
|
|||
|
appendstring(cp, buffer2);
|
|||
|
appendstring(cp, "\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Beendet die Verbindung eines Server's vom Netzwerk. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcSquitCommand(CONNECTION *cp)
|
|||
|
{
|
|||
|
char buffer[2048];
|
|||
|
char *arg;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcSquitCommand)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
arg = getarg(0, 1); /* Server einlesen. */
|
|||
|
|
|||
|
if (!*arg) /* kein Server angegeben. */
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 461 %s SQUIT :Not enough parameters\n"
|
|||
|
, myhostname
|
|||
|
, cp->nickname);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (cp->operator != 2) /* Kein Sysop, keine Aenderung. */
|
|||
|
{
|
|||
|
sprintf(buffer, ":%s 481 %s :Permission Denied- You're not an IRC operator\n"
|
|||
|
, myhostname
|
|||
|
, cp->name);
|
|||
|
appendstring(cp, buffer);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
sprintf(buffer, "/link reset %s", arg); /* Reset-Befehl vorbereiten. */
|
|||
|
getarg(buffer, 0);
|
|||
|
|
|||
|
links_command(cp); /* Server killen. */
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Username an IRC-Server weiterleiten. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcLinkUser(char *user)
|
|||
|
{
|
|||
|
char *scall;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcLinkUser)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
if (tcppoi->Interface != KISS_IRC) /* Kein IRC-Interface. */
|
|||
|
{
|
|||
|
user[0] = 0; /* Rufzeichen loeschen. */
|
|||
|
tcppoi->disflg |= 0x80; /* Verbindung schliessen. */
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if ((scall = strchr(user, ' ')) != FALSE) /* Zum Rufzeichen springen. */
|
|||
|
{
|
|||
|
scall++; /* Leerzeichen entfernen. */
|
|||
|
strncpy(user, scall, L2CALEN); /* Rufzeichen sichern. */
|
|||
|
user[6] = 0; /* Sicher ist sicher. */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/******************************************************************************/
|
|||
|
/* */
|
|||
|
/* Nickname an IRC-Server weiterleiten. */
|
|||
|
/* */
|
|||
|
/******************************************************************************/
|
|||
|
void IrcLinkNick(char *header)
|
|||
|
{
|
|||
|
READRX *SRx;
|
|||
|
register int i;
|
|||
|
#ifdef DEBUG_MODUS
|
|||
|
lastfunc = "l1irc(IrcLinkNick)";
|
|||
|
#endif /* DEBUG_MODUS */
|
|||
|
|
|||
|
if (header[0] == FALSE) /* Kein Nick angegeben. */
|
|||
|
return; /* Abbrechen. */
|
|||
|
|
|||
|
if ((SRx = (READRX *)allocb(ALLOC_L1TCPIP)) == NULL) /* RX-Seg. besorgen */
|
|||
|
return; /* Kein Segment frei, abbruch. */
|
|||
|
|
|||
|
if ((SRx->Data = SetBuffer()) == NULL) /* Buffer besorgen. */
|
|||
|
{
|
|||
|
dealoc((MBHEAD *)ulink((LEHEAD *)SRx)); /* RX-Segment entsorgen. */
|
|||
|
return; /* Buffer ist voll, abbruch. */
|
|||
|
}
|
|||
|
|
|||
|
SRx->Sock = tcppoi->sock; /* Socket setzen. */
|
|||
|
SRx->Interface = tcppoi->Interface; /* Interface setzen. */
|
|||
|
SRx->Mode = tcppoi->mode; /* Stack-Mode setzen. */
|
|||
|
|
|||
|
for (i = 0; i < (signed)strlen(header); ++i) /* Nickname eintragen. */
|
|||
|
putchr(header[i], SRx->Data);
|
|||
|
|
|||
|
relink((LEHEAD *) SRx, (LEHEAD *)rxflRX.tail); /* RX-Liste umhaengen. */
|
|||
|
}
|
|||
|
|
|||
|
#endif /* L1IRC */
|
|||
|
|
|||
|
/* End of src/l1irc.c */
|