123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- #include "main.h"
- #include "irc.h"
- #include "functions.h"
- #include "dictionary.h"
- #define MAINBUFSIZ 36864
- #define LINEBUFSIZ 4096
- char *process_string(char *in, int n) {
- int ii = -1, o, i, e;
- char *nothing = "0";
- static char buf[MAINBUFSIZ];
- for(i = 0; i < n; i++) {
- ii++;
- buf[ii] = in[i];
- if((i > 0 && in[i] == '\n' && in[i-1] == '\r') || ii == 512) {
- buf[ii + 1] = '\0';
- o = ii;
- ii = -1;
- printf("<< %s", buf);
- in[n] = 0;
- if (!strncmp(buf, "PING", 4)) {
- buf[1] = 'O';
- sleep(2);
- return buf;
- }
- if(buf[0] == ':') {
- char *name;
- char *cmd;
- char *chan;
- char *e;
- char *topic;
- char *topicchan;
- char *msg;
- static char b[LINEBUFSIZ];
- name = buf+1;
- e = strchr(name,'!');
- if (!e)
- return nothing;
- *e = 0;
- cmd = strchr(e+1,' ');
- if (!cmd)
- return nothing;
- cmd++;
- e = strchr(cmd,' ');
- if (!e)
- return nothing;
- *e = 0;
- chan = e+1;
- e = strchr(chan,' ');
- if (!e)
- e = strchr(chan,'\r');
- if (!e)
- e = strchr(chan,'\n');
- if (e)
- *e = 0;
- if (!strcmp(cmd, "JOIN")) {
- if(strncmp(name, nick, strlen(nick))==0) {
- return nothing;
- } else {
- sprintf(b,"PRIVMSG %s :Welcome %s\r\n",chan,name);
- return b;
- }
- } else if(!strcmp(cmd, "PRIVMSG")) {
-
- msg = strchr(e+1, ':');
- if(!msg)
- return nothing;
- if(msg)
- msg++;
-
- int k;
-
- char *usestr = NULL;
- char *searchstr;
- for(k=0;dictionary[k].quote != 0;k++) {
- if(strncmp(bot_nick_exists(dictionary[k].quote, nick), "0", 1)) {
- usestr = str_replace(dictionary[k].quote,
- "*bot*", nick);
- }
-
- if(usestr==NULL) {
- searchstr = dictionary[k].quote;
- } else {
- searchstr = usestr;
- }
-
- if(strncmp(msg, searchstr, strlen(searchstr))==0) {
- sprintf(b,"PRIVMSG %s :%s, %s\r\n",chan,
- name,dictionary[k].reply);
- if(searchstr != NULL) free(searchstr);
- return b;
- }
- if(searchstr != NULL) free(searchstr);
- }
- /*if(strncmp(msg, "@topic", 4)==0) {
- if(strncmp(name, owner, strlen(owner))==0) {
- (void)set_topic(e, topic, "./channels.log");
- sprintf(b,"PRIVMSG %s :Topic set.\r\n", name);
- return b;
- } else {
- sprintf(b,"PRIVMSG %s :You are not the owner, you cannot set topics.\r\n", name);
- return b;
- }
- }*/
-
- if(strncmp(msg, "@help", 5)==0) {
- memset(b,0,sizeof(b));
- sprintf(b,"PRIVMSG %s :---HELP---\r\n" \
- "PRIVMSG %s :@register <password> - Register your username\r\n" \
- "PRIVMSG %s :@login <password> - Login to services\r\n" \
- "PRIVMSG %s :@claim <channel> <user password> - Register IRC channel to your nickname\r\n" \
- "PRIVMSG %s :@release <nickname> <user password> - Release your nickname if someone else logs on with it.\r\n" \
- "PRIVMSG %s :@topic <channel> \"<channel topic>\" <user password> - Set your channel topic if you own the channel.\r\n",
- name, name, name, name, name, name);
- return b;
- }
-
- if(strncmp(msg, "@topic", 6)==0) {
- memset(b,0,sizeof(b));
- topicchan = strchr(msg, ' ');
- if(!topicchan) {
- sprintf(b,"PRIVMSG %s :You must provide a channel!.\r\n", name);
- return b;
- }
- if(topicchan)
- topicchan++;
- topic = strchr(topicchan, ' ');
-
- if(!topic) {
- sprintf(b,"PRIVMSG %s :Provide a topic\r\n", name);
- return b;
- }
- if(topic)
- *topic = 0;
-
- topic++;
-
- topic = strchr(topic, '"');
-
- if(!topic) {
- sprintf(b,"PRIVMSG %s :Provide your topic in quotes! (Ex: \"this topic is what it is\")\r\n", name);
- return b;
- }
- if(topic) {
- *topic = 0;
- topic++;
- }
-
- e = strchr(topic, '"');
-
- if(!e) {
- sprintf(b,"PRIVMSG %s :Close your topic quotes!\r\n", name);
- return b;
- }
-
- /*
- if(e) {
- *e = 0;
- }
- */
-
- char *pass = strtok(e, " ");
-
- pass = strtok(NULL, " ");
-
- if(!pass) {
- sprintf(b,"PRIVMSG %s :Please provide your password!\r\n", name);
- return b;
- }
-
- if(check_user_passwd(name, remove_creturn(pass), "./users.log")==2) {
- sprintf(b,"PRIVMSG %s :This user is not registered.\r\n", name);
- return b;
- } else if(check_user_passwd(name, remove_creturn(pass), "./users.log")==1) {
- sprintf(b,"PRIVMSG %s :Wrong password. (%s)\r\n", name, remove_creturn(pass));
- return b;
- }
-
- if(check_channel_owner(name, topicchan, "./owners.log")==1) {
- sprintf(b,"PRIVMSG %s :You're not the channel owner!\r\n", name);
- return b;
- } else if(check_channel_owner(name, topicchan, "./owners.log")==2) {
- sprintf(b,"PRIVMSG %s :Channel not registered!\r\n", name);
- return b;
- } else {
- topic[strlen(topic)-1] = 0; /* strip last quote from string */
- sprintf(b,"TOPIC %s :%s\r\nPRIVMSG %s :Topic for %s set to \"%s\".\r\n", topicchan, topic, name, topicchan, topic);
- return b;
- }
-
- }
-
- if(strncmp(msg, "@release", 8)==0) {
- memset(b,0,sizeof(b));
- e = strchr(msg, ' ');
- if(!e) {
- sprintf(b,"PRIVMSG %s :You must provide a username.\r\n", name);
- return b;
- }
- if(e)
- e++;
-
- pass = strtok(e, " ");
- pass = strtok(NULL, " ");
- if(!pass) {
- sprintf(b,"PRIVMSG %s :You must provide your password to claim your nickname!\r\n", name);
- return b;
- }
-
- if(strncmp(e, nick, strlen(nick))==0) {
- sprintf(b,"PRIVMSG %s :Cannot claim %s\r\n", name, nick);
- return b;
- }
-
- if(check_user_passwd(e, remove_creturn(pass), "./users.log")==2) {
- sprintf(b,"PRIVMSG %s :This user is not registered.\r\n", name);
- return b;
- }
- if(check_user_passwd(e, remove_creturn(pass), "./users.log")==1) {
- sprintf(b,"PRIVMSG %s :Wrong password. (%s)\r\n", name, pass);
- return b;
- }
-
- sprintf(b,"KILL %s :User verified password, released\r\n", remove_creturn(e));
- return b;
-
-
- }
-
- if(strncmp(msg, "@claim", 6)==0) {
- memset(b,0,sizeof(b));
- e = strchr(msg, ' ');
- if(!e)
- return nothing;
- if(e)
- e++;
-
- pass = strtok(e, " ");
- pass = strtok(NULL, " ");
- if(!pass) {
- sprintf(b,"PRIVMSG %s :You must provide a password to grab a channel!\r\n", name);
- return b;
- }
-
- if(check_user_passwd(name, remove_creturn(pass), "./users.log")==2) {
- sprintf(b,"PRIVMSG %s :You are not registered, see @help\r\n", name);
- return b;
- }
- if(check_user_passwd(name, remove_creturn(pass), "./users.log")==1) {
- sprintf(b,"PRIVMSG %s :Wrong password. (%s)\r\n", name, pass);
- return b;
- }
-
- if(set_channel_owner(name, e, "./owners.log")==0) {
- sprintf(b,"JOIN %s\r\nMODE %s +o %s\r\nMODE %s :+tn\r\nPRIVMSG %s :You now own %s\r\n", remove_creturn(e), remove_creturn(e), nick, remove_creturn(e), name, e);
- return b;
- } else {
- sprintf(b,"PRIVMSG %s :Failed to set you as owner (%s)\r\n", name, remove_creturn(e));
- return b;
- }
- }
-
- if(strncmp(msg, "@login", 6)==0) {
- memset(b,0,sizeof(b));
- e = strchr(msg, ' ');
- if(!e)
- return nothing;
- if(e)
- e++;
-
- if(check_user_passwd(name, remove_creturn(e), "./users.log")==2) {
- sprintf(b,"PRIVMSG %s :You are not registered, see @help\r\n", name);
- return b;
- }
- if(check_user_passwd(name, remove_creturn(e), "./users.log")==1) {
- sprintf(b,"PRIVMSG %s :Wrong password. (%s)\r\n", name, remove_creturn(e));
- return b;
- }
-
- sprintf(b,"MODE %s +r\r\nPRIVMSG %s :%s has been successfully identified!\r\n", name, name, name);
- return b;
- }
-
- if(strncmp(msg, "@register", 9)==0) {
- memset(b,0,sizeof(b));
- e = strchr(msg, ' ');
- if(!e) {
- sprintf(b,"PRIVMSG %s :You must provide a password.\r\n", name);
- return b;
- }
- if(e)
- e++;
-
- if(check_user_passwd(name, remove_creturn(e), "./users.log")!=2) {
- sprintf(b,"PRIVMSG %s :This user already exists.\r\n", name);
- return b;
- }
-
- if(register_nick(name, remove_creturn(e), "./users.log")==0) {
- sprintf(b,"PRIVMSG %s :You now own %s (password: %s). Please login using the @login command\r\n", name, name, remove_creturn(e));
- return b;
- } else {
- sprintf(b,"PRIVMSG %s :Failed to register %s\r\n", name, name);
- return b;
- }
- }
-
- return nothing;
- } else {
- return nothing;
- }
- }
- }
- } // for loop
- }
- int main(int argc, char **argv) {
- int socketfd, n;
- char in[MAINBUFSIZ+1], out[MAINBUFSIZ+1], c[LINEBUFSIZ];
- char *pos, *action;
- if(argc != 6) {
- printf("Usage: %s <address> <port> <nick> <owner> <operator password>\n", argv[0]);
- exit(1);
- } else if(atoi(argv[2]) < 1 || atoi(argv[2]) > 50000) {
- printf("Invalid port specified.\n");
- exit(1);
- } else if(irc_connect(argv[1], atoi(argv[2]), &socketfd) == 0) {
- printf("Failed to connect to %s.\n", argv[1]);
- exit(1);
- }
- nick = argv[3];
- owner = argv[4];
- pass = argv[5];
- if(strlen(nick)>12) {
- printf("Error: irc bot nickname too long\n");
- exit(1);
- }
-
- if(strlen(owner)>12) {
- printf("Error: bot owner nickname too long\n");
- exit(1);
- }
- /* write to buffer */
- sprintf(c, "NICK %s\r\n", nick);
- irc_send(socketfd, c);
- sprintf(c, "USER %s %s %s :%s\r\n", nick, nick, nick, nick);
- irc_send(socketfd, c);
- sleep(5);
- sprintf(c, "OPER %s %s\r\n", nick, pass);
- irc_send(socketfd, c);
- sleep(2);
- sprintf(c, "MODE %s :+Sqx\r\n", nick);
- irc_send(socketfd, c);
- /* do the service jobs */
- if(join_channels(socketfd, "./owners.log") == 2) {
- return 1;
- }
- while(1) {
- in[0] = 0;
- n = irc_read(socketfd, in);
- if (n > 0) {
- char *str = process_string(in, n);
- if(strncmp(str, "0", 1)!=0) {
- irc_send(socketfd, str);
- fflush(stderr);
- }
- if(strncmp(str, "QUIT", 4)==0) {
- fflush(stderr);
- break;
- }
- } // if(n > 0)
- } // while(1)
- return 0;
- }
|