⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irc.c

📁 P2P NAP的C实现 P2P在网络应用中越来越流行
💻 C
📖 第 1 页 / 共 3 页
字号:
}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 + -