summaryrefslogtreecommitdiff
path: root/libirc/examples/link.c
blob: 5c13e945505c4eeef7c612fa723425a71ec95ed2 (plain) (blame)
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <irc.h>

#define mywrite(a,b) write(a,b,strlen(b))

int *fds;
char **chans;

void extra_handler(int fd) {
 return;
}

struct user {
 char *nick;
 char *user;
 char *host;
};

void privmsg_others(int fd,char *msg) {
 int i;
 char tmp[512];
 for(i=0;fds[i] != -1;i++) {
  if(fds[i] != fd) {
   snprintf(tmp,sizeof(tmp)-1,"PRIVMSG %s :%s\r\n",chans[fdtoi(fds[i])],msg);
   write(fds[i],tmp,strlen(tmp));
  }
 }
}

void message_handler(int fd,char *from,struct user *user,char *line) {
 int i;
 char tmp[512];
 if(!strcmp(from,chans[fdtoi(fd)])) {//don't want to be forwarding PMs. :P
  snprintf(tmp,sizeof(tmp)-1,"<%s> %s",user->nick,line);
  privmsg_others(fd,tmp);
 }
}

void line_handler(int fd,char *line) {//this should be built into the libary?
 char *s=line,*t=0,*u=0;
 char tmp[512];
 struct user *user=malloc(sizeof(struct user));
 user->nick=0;
 user->user=0;
 user->host=0;
 if(strchr(line,'\r')) *strchr(line,'\r')=0;
 if(strchr(line,'\n')) *strchr(line,'\n')=0;
 printf("line: '%s'\n",line);
 if(line[0]==':') {
  if((user->nick=strchr(line,':'))) {
   *(user->nick)=0;
   (user->nick)++;
  }
 }
 if(user->nick) {
  if((s=strchr((user->nick),' '))) {
   *s=0;
   s++;
   if((t=strchr(s,' '))) {
    *t=0;
    t++;
    if((u=strchr(t,' '))) {//:
     *u=0;
     u++;
    }
   }
  }
  if(((user->user)=strchr((user->nick),'!'))) {
   *(user->user)=0;
   (user->user)++;
   if(((user->host)=strchr((user->user),'@'))) {
    *(user->host)=0;
    (user->host)++;
   }
  } else {
   user->host=user->nick;
  }
 }
 if(!user->user && s) {
  if(!strcmp(s,"004")) {
   snprintf(tmp,sizeof(tmp)-1,"JOIN %s\r\n",chans[fdtoi(fd)]);
   mywrite(fd,tmp);
  }
 }
 if(s && t && u) {
  if(!strcmp(s,"PRIVMSG")) {
   message_handler(fd,*t=='#'?t:user->nick,user,++u);
  }
 }
 if(s && user->nick && t) {
  if(!strcmp(s,"JOIN")) {
   snprintf(tmp,sizeof(tmp)-1,"%cACTION %s has joined %s%c",1,user->nick,t+1,1);
   privmsg_others(fd,tmp);
   //send a join message to the other end.
  }
 }
 free(user);
}

int fdtoi(int fd) {
 int i;
 for(i=0;fds[i] != -1;i++) {
  if(fds[i] == fd) return i;
 }
 return -1;
}

int main(int argc,char *argv[]) {
 fds=malloc(sizeof(int) * (argc+3) / 3);
 chans=malloc(sizeof(char *) * (argc+3) / 3);
 int i=0;
 printf("%d\n",argc);
 for(i=0;((i*3)+3)<argc;i++) {
  printf("%d server: %s port: %s channel: %s\n",i,argv[(i*3)+1],argv[(i*3)+2],argv[(i*3)+3]);
  fds[i]=serverConnect(argv[(i*3)+1],argv[(i*3)+2]);
  chans[i]=strdup(argv[(i*3)+3]);
  mywrite(fds[i],"NICK link\r\nUSER a b c :d\r\n");
 }
 fds[i]=-1;
 //heh. you can write your own code for picking a different nick per server. fuck you.
 runem(fds,line_handler,extra_handler);
}