📄 irc.c
字号:
}I_IRC_FUNC(h314){ chans_t *c = findchan(chanl, tok[3]); recent = c; wp(win, "%s _________________%s\n", DARK, WHITE); wp(win, "%s|%s User: %s\n", DARK, WHITE, tok[3]); wp(win, "%s|%s IRC name: %s\n", DARK, WHITE, str+strlen(tok[0])+strlen(tok[1])+strlen(tok[2])+strlen(tok[3])+strlen(tok[4])+strlen(tok[5])+strlen(tok[6])+8); wp(win, "%s|%s Address: %s@%s\n", DARK, WHITE, tok[4], tok[5]); drw(win); recent = NULL; return(1);}I_IRC_FUNC(h315){ nwho--; return(1);}I_IRC_FUNC(h341){ wp(win, "%s* Inviting %s to %s%s\n", BRIGHT(BLUE), tok[3], tok[4], WHITE); drw(win); return(1);}I_IRC_FUNC(hinvite){ char *nk = gnick(tok[0]+1); wp(win, "%s* [%s%s%s] has invited you to %s%s\n", BRIGHT(BLUE), WHITE, nk, BRIGHT(BLUE), tok[3]+1, WHITE); drw(win); free(nk); return(1);}I_IRC_FUNC(herr){ wp(win, "%s* %s%s\n", RED, str+strlen(tok[0])+strlen(tok[1])+strlen(tok[2])+strlen(tok[3])+5, WHITE); drw(win); return(1);}/* changed to not collide with netdb.h */I_IRC_FUNC(herr2){ wp(win, "%s* %s%s\n", RED, str+strlen(tok[0])+2, WHITE); drw(win); return(1);} O_IRC_FUNC(imsg){ sock_t *sk; char *nm=NULL; if (num < 2) { wp(win, "%s* No nickname or channel given%s\n", RED, WHITE); drw(win); return; } if (num < 3) { wp(win, "%s* No message given%s\n", RED, WHITE); drw(win); return; } if (*tok[1] == '=') { msprintf(&nm, "chat %s", tok[1]+1); sk = findsock(nm); free(nm); if (!sk) { wp(win, "%s* No DCC connection to %s found%s\n", RED, tok[1]+1, WHITE); drw(win); return; } ssock(sk->fd, "%s\n", cstr(str, 2)); wp(win, "%s* --> [%s(%s)%s]%s %s\n", GREEN, WHITE, tok[1]+1, GREEN, WHITE, cstr(str, 2)); drw(win); return; } ssock(s, "PRIVMSG %s :%s\n", tok[1], cstr(str, 2)); wp(win, "%s* --> (%s%s%s)%s %s\n", GREEN, WHITE, tok[1], GREEN, WHITE, cstr(str, 2)); drw(win);}O_IRC_FUNC(inotice){ if (num < 2) { wp(win, "%s* No nickname or channel given%s\n", RED, WHITE); drw(win); return; } if (num < 3) { wp(win, "%s* No message given%s\n", RED, WHITE); drw(win); return; } ssock(s, "NOTICE %s :%s\n", tok[1], cstr(str, 2)); wp(win, "%s* --> (%s)%s %s\n", MAGENTA, tok[1], WHITE, cstr(str, 2)); drw(win);}O_IRC_FUNC(iquit){ if (num < 2) ssock(s, "QUIT :Leaving\n"); else ssock(s, "QUIT :%s\n", cstr(str, 1));}O_IRC_FUNC(ikick){ if (!curchan || curchan->q != 2) { wp(win, "%s* You are not on a channel%s\n", RED, WHITE); drw(win); return; } if (num < 2) { wp(win, "%s* No nickname given%s\n", RED, WHITE); drw(win); return; } ssock(s, "KICK %s %s :%s\n", curchan->nm, tok[1], cstr(str, 2));}O_IRC_FUNC(ime){ if (!curchan || curchan->q == 1) { wp(win, "%s* You are not on a channel%s\n", RED, WHITE); drw(win); return; } ssock(s, "PRIVMSG %s :\001ACTION %s\001\n", curchan->nm, cstr(str, 1)); recent = curchan; wp(win, "%s* %s%s %s\n", CYAN, mnick, WHITE, cstr(str, 1)); drw(win); recent = NULL;}O_IRC_FUNC(inick){ if (!ircin) { if (mnick) free(mnick); mnick = strdup(cstr(str, 1)); } ssock(s, "%s\n", str);}O_IRC_FUNC(iirc){ if (ircmode) { wp(win, "%s* IRC mode toggled: Off%s\n", RED, WHITE); drw(win); ircmode = 0; } else { wp(win, "%s* IRC mode toggled: On%s\n", RED, WHITE); drw(win); ircmode = 1; }}O_IRC_FUNC(iwhois){ if (num < 2) ssock(s, "WHOIS %s\n", mnick); else ssock(s, "%s\n", str);}O_IRC_FUNC(itopic){ chans_t *cur; if (num == 1) { if (!curchan || curchan->q != 2) { wp(win, "%s* Error: You're not on channel%s\n", RED, WHITE); drw(win); return; } if (curchan->q == 2) { ssock(s, "TOPIC %s\n", curchan->nm); return; } if (!curchan->topic) wp(win, "%s* No topic set%s\n", YELLOW, WHITE); else wp(win, "%s* Topic for %s: %s%s\n", YELLOW, curchan->nm, curchan->topic, WHITE); drw(win); return; } else if (num == 2) { cur = findchan(chanl, tok[1]); if (!cur || cur->q == 2) { ssock(s, "TOPIC %s\n", tok[1]); return; } if (!cur->topic) wp(win, "%s* No topic set%s\n", YELLOW, WHITE); else wp(win, "%s* Topic for %s: %s%s\n", YELLOW, cur->nm, cur->topic, WHITE); drw(win); return; } ssock(s, "TOPIC %s :%s\n", tok[1], cstr(str, 2)); return;}O_IRC_FUNC(ipart){ chans_t *pt; sock_t *sk; if (num == 1) pt = curchan; else pt = findchan(chanl, tok[1]); if (!pt && num > 1) { wp(win, "%s* You are not on %s channel %s\n", RED, tok[1], WHITE); drw(win); return; } else if (!pt) { wp(win, "%s* You are not on a channel %s\n", RED, WHITE); drw(win); return; } if (!pt->q) { sk = findsock("server"); if (sk) { sendpack(sk->fd, NAP_PART, "%s", pt->nm); pt->p |= 1; } return; } else if (pt->q == 2) { ssock(s, "PART %s\n", pt->nm); pt->p |= 1; return; } wp(win, "%s* Ended query with %s%s\n", GREEN, pt->nm, WHITE); drw(win); delchan(pt); drw(win); return;}O_IRC_FUNC(iaddr){ if (!curchan || num < 2 || !finduser(curchan, tok[1])) return; wp(win, "|%s|\n", finduser(curchan, tok[1])->addr); drw(win);}O_IRC_FUNC(iban){ int i, c=0, j; user_t *cur; char rhost[256], *mask=NULL; if (!curchan || curchan->q != 2) { wp(win, "%s* You are not on a channel %s\n", RED, WHITE); drw(win); return; } if (num < 2) { wp(win, "%s* No nickname specified%s\n", RED, WHITE); drw(win); return; } cur = finduser(curchan, tok[1]); if (!cur) { wp(win, "%s* No such user on channel%s\n", RED, WHITE); drw(win); return; } memset(rhost, 0, sizeof(rhost)); if (isdigit(cur->addr[strlen(cur->addr)-1])) { strcpy(rhost, cur->addr); i = 0; while (rhost[i] != '@') i++; i++; for (c=0;c!=2;i++) if (rhost[i] == '.') c++; rhost[i] = 0; if (*rhost == '~') msprintf(&mask, "*!*%s*", rhost+1); else msprintf(&mask, "*!*%s*", rhost); } else { for (i=strlen(cur->addr),c=0;c!=2;i--) if (cur->addr[i] == '.') c++; for (j=0;cur->addr[j]!='@';j++) rhost[j] = cur->addr[j]; rhost[j] = 0; if (*rhost == '~') msprintf(&mask, "*!*%s@*%s", rhost+1, cur->addr+i+1); else msprintf(&mask, "*!*%s@*%s", rhost, cur->addr+i+1); } ssock(s, "MODE %s +b %s\n", curchan->nm, mask); free(mask);}O_IRC_FUNC(inap){ int t = ircmode, ns, r; sock_t *sk; sk = findsock("server"); if (!sk) ns = -1; else ns = sk->fd; ircmode = 0; lpbrk = 0; /* clear previous loop interrupt request */ r = parseout(ns, cstr(str, 1), win); ircmode = t;}O_IRC_FUNC(ictcp){ if (num < 2) { wp(win, "%s* No nickname specified%s\n", RED, WHITE); drw(win); return; } else if (num < 3) { wp(win, "%s* No CTCP command specified%s\n", RED, WHITE); drw(win); return; } ssock(s, "PRIVMSG %s :\001%s\001\n", tok[1], cstr(str, 2)); recent = curchan; wp(win, "%s* CTCP %s request to %s%s\n", CYAN, tok[2], tok[1], WHITE); drw(win); recent = NULL;}O_IRC_FUNC(iinvite){ if (num < 2) return; else if (num < 3) ssock(s, "INVITE %s %s\n", tok[1], curchan->nm); else ssock(s, "INVITE %s %s\n", tok[1], tok[2]);} O_IRC_FUNC(iopsay){ user_t *usr; char buf[256]; int c; if (num < 2) return; if (!curchan) { wp(win, "%s* You're not on a channel%s\n", RED, WHITE); drw(win); return; } memset(buf, 0, sizeof(buf)); for (usr=curchan->users,c=0;;usr=usr->next) { if (!usr) { if (*buf) { buf[strlen(buf)-1] = 0; ssock(s, "NOTICE %s :%s\n", buf, cstr(str, 1)); } break; } if (c == 4) { buf[strlen(buf)-1] = 0; ssock(s, "NOTICE %s :%s\n", buf, cstr(str, 1)); memset(buf, 0, sizeof(buf)); c = 0; } if (usr->flag & NAP_OP) { strcat(buf, usr->nm); strcat(buf, ","); c++; } }}O_IRC_FUNC(idcc){ char *nm=NULL; struct sockaddr_in me, frm; int sock, port, frmlen = sizeof(me); sock_t *sk; if (num < 3) { wp(win, "%s* Insufficient parameters%s\n", RED, WHITE); drw(win); return; } if (!strcasecmp(tok[1], "close")) { msprintf(&nm, "chat %s", tok[2]); sk = findsock(nm); free(nm); nm = NULL; if (sk) { close(sk->fd); delsock(sk->fd); wp(win, "%s* Closed active DCC chat to %s%s\n", RED, tok[2], WHITE); drw(win); return; } msprintf(&nm, "pending %s", tok[2]); sk = findsock(nm); free(nm); nm = NULL; if (sk) { close(sk->fd); free(sk->dxx); sk->dxx = NULL; delsock(sk->fd); wp(win, "%s* Rejected pending DCC chat to %s%s\n", RED, tok[2], WHITE); drw(win); ssock(s, "NOTICE %s :\001DCC REJECT CHAT chat\001\n", tok[2]); return; } msprintf(&nm, "listen %s", tok[2]); sk = findsock(nm); free(nm); nm = NULL; if (sk) { close(sk->fd); delsock(sk->fd); wp(win, "%s* Closed waiting DCC chat to %s%s\n", RED, tok[2], WHITE); drw(win); return; } wp(win, "%s* Unable to find any DCC involving %s%s\n", RED, tok[2], WHITE); drw(win); return; } if (cport == -1) cport = 1024+getpid(); port = cport++; me.sin_addr.s_addr = INADDR_ANY; me.sin_port = htons(port); me.sin_family = AF_INET; sock = socket(AF_INET, SOCK_STREAM, 0); if (bind(sock, (struct sockaddr *)&me, sizeof(me)) == -1) { wp(win, "%s* Error creating DCC socket%s\n", RED, WHITE); drw(win); return; } listen(sock, 0); msprintf(&nm, "listen %s", tok[2]); addsock(sock, nm, S_R, ldcc); free(nm); getsockname(s, (struct sockaddr *)&frm, &frmlen); ssock(s, "PRIVMSG %s :\001DCC CHAT chat %lu %i\001\n", tok[2], (long)ntohl(frm.sin_addr.s_addr), port);}O_IRC_FUNC(ichat){ char *nm=NULL; sock_t *sk; unsigned long addr; int port, sock; struct sockaddr_in dst; if (num < 2) { wp(win, "%s* Need to specify a nickname%s\n", RED, WHITE); drw(win); return; } msprintf(&nm, "pending %s", tok[1]); sk = findsock(nm); free(nm); nm = NULL; if (!sk) { wp(win, "%s* No pending DCC to %s could be found%s\n", RED, tok[1], WHITE); drw(win); return; } sscanf(sk->dxx, "%lu %i", &addr, &port); sock = socket(AF_INET, SOCK_STREAM, 0); dst.sin_addr.s_addr = htonl(addr); dst.sin_port = htons(port); dst.sin_family = AF_INET; free(sk->dxx); sk->dxx = NULL; delsock(sk->fd); if (connect(sock, (struct sockaddr *)&dst, sizeof(dst)) == -1) { wp(win, "%s* Error creating DCC connection to %s%s\n", RED, tok[1], WHITE); drw(win); close(sock); return; } setkeepalive(sock); msprintf(&nm, "chat %s", tok[1]); addsock(sock, nm, S_R, dccfunc); wp(win, "%s* DCC Connection to %s established%s\n", BRIGHT(CYAN), tok[1], WHITE); drw(win); free(nm);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -