Przeglądaj źródła

* Wrote initial response functions
Simply update misc/responses.txt and 'make res' :)


svn: 1145

Bryan Drewery 22 lat temu
rodzic
commit
75a2595536

+ 20 - 2
Makefile.in

@@ -92,7 +92,7 @@ clean:  cleanutils
 	+@cd src/crypto && $(MAKE) clean
 	+@cd src/mod && $(MAKE) distclean
 	@rm -f $(HUBEXEC) $(LEAFEXEC) *.stamp *~ src/*~ configure.temp .mangled
-	@rm -f $(HUBEXEC).* $(LEAFEXEC).* src/settings.c src/salt.h src/help.h utctime
+	@rm -f $(HUBEXEC).* $(LEAFEXEC).* src/settings.c src/salt.h src/help.h src/response.h src/responses.h utctime
 
 distclean: clean
 	@rm -f Makefile src/Makefile src/compat/Makefile src/mod/Makefile src/crypto/Makefile
@@ -170,12 +170,30 @@ help: packconf makehelp stringfix
 	cp -f src/help.h~ src/help.h; \
 	fi)
 
+res: makeres
+	@src/makeres misc/responses.txt src/ 1
+	@(if [ ! -f src/response.h ]; then \
+	touch src/response.h; \
+	fi)
+	@(if [ ! -f src/responses.h ]; then \
+	touch src/responses.h; \
+	fi)
+	@(if test "x`diff -qurN src/response.h~ src/response.h`" != "x"; then \
+	cp -f src/response.h~ src/response.h; \
+	fi)
+	@(if test "x`diff -qurN src/responses.h~ src/responses.h`" != "x"; then \
+	cp -f src/responses.h~ src/responses.h; \
+	fi)
+
 stringfix: packconf src/stringfix.c config.h
 	+@cd src && ${MAKE_UTILS} stringfix
 
 makesettings: src/makesettings.c
 	+@cd src && ${MAKE_UTILS} makesettings
 
+makeres: src/makeres.c
+	+@cd src && ${MAKE_UTILS} makeres
+
 makehelp: packconf src/makehelp.c
 	+@cd src && ${MAKE_UTILS} makehelp
 
@@ -187,7 +205,7 @@ utils: makesettings stringfix makehelp
 crypto:
 	+@cd src/crypto && ${MAKE_UTILS} crypto
 
-general: makesettings packconf salt help 
+general: makesettings packconf salt help res
 
 leaf:	general
 	@echo ""

+ 1 - 0
doc/UPDATES

@@ -2,6 +2,7 @@ This is a summary of ChangeLog basically.
 
 1.2
 * No longer displaying SATLS on ./bin -v
+* Wrote new 'response' code for misc stuff like kick reasons, and dcc responses...
 
 1.1.9
 

+ 137 - 0
misc/responses.txt

@@ -0,0 +1,137 @@
+:banned
+ bye
+ banned
+ see you in hell
+ go away
+ cya around lewser
+ unwanted!
+:kuser
+ not wanted
+ something tells me you're annoying
+ don't bug me lewser
+ creep
+:kickban
+ gone
+ stupid
+ lewser
+ ...
+:massdeop
+ spammer!
+ easy on the modes now
+ mode this
+ nice try
+ really?
+ you lose
+ scary... really scary...
+ i win kthx
+:badop
+ neat...
+ oh, no you don't. go away.
+ didn't you forget something now?
+ no
+ hijack this
+:badopped
+ fuck off kid
+ asl?
+ whoa... what a hacker... skills!
+ yes! yes! yes! hit me baby one more time!
+ with your skills, you're better off jacking off than hijacking
+:manualop
+ naughty kid
+ didn't someone tell you that is bad?
+ want perm?
+ see how much good that did you?
+ not a smart move...
+ jackass!
+:manualopped
+ your pal got mean friends. like me.
+ uhh now.. don't wake me up...
+ hi hun. missed me?
+ spammer! die!
+ boo!
+ that @ was useful, don't ya think
+ not in my book
+ lol, really?
+:closed
+ locked
+ later
+ closed for now
+ come back later
+ better safe than sorry
+ cleanup, come back later
+ this channel is closed
+ shutting down for now
+ lockdown
+ reopening later
+ not for the public atm
+ private channel for now
+ might reopen soon, might reopen later
+ you're not supposed to be here right now
+ sorry, closed
+ try us later, atm we're locked down
+ closed. try tomorrow
+:flood
+ so much bullshit in such a short time. amazing.
+ slow down. i'm trying to read here.
+ uhm... you actually think irc is for talking?
+ talk talk talk
+ blabbering are we?
+ ... and i don't even like you!
+ and you're outa here...
+:nickflood
+ make up your mind?
+ be schizofrenic elsewhere
+ I'm loosing track of you... not
+ that is REALLY annoying
+ try this: /NICK n00b
+ playing hide 'n' seek?
+ gotcha!
+:kickflood
+ easier to just leave if you wan't to be alone
+ cool down
+ don't be so damned aggressive. that's my job.
+ kicking's fun, isn't it?
+ what's the rush?
+ next time you do that, i'll kick you again
+:mean
+ hey! that wasn't very nice!
+ don't fuck with my pals
+ meanie!
+ I can be a bitch too...
+ leave the bots alone, will ya?
+ not very clever
+ watch it
+ fuck off
+ easy now. that's a friend.
+ abuse of power. leave that to me, will ya?
+ there as some things you cannot do, and that was one of them...
+:username
+ sup
+ a/s/l?\ni'm 17/f/ca ;)
+ who are you?
+ uhhh do i know you?
+ what?
+ wtf do you want?
+ hold on a second, I am sort of busy..
+ mIRC v6.03 File Server\n\nUse: cd dir ls get read help exit\n[\\]
+ got any porn?
+ ?
+:password
+ what?
+ huh?
+ no.
+ thats great..
+ hmm, ok..I've got a better idea, check this out: http://peeldmonkeys.8k.com/images/keza-_middle_finger.jpg
+ I don't remember caring..
+ good for you.
+ I'm going to report you to the RIAA!!!
+:baduserpass
+ stop wasting my time.
+ gtg
+ go away
+ fuck off already
+ ehh..no, bye.
+ hey I'm late for a date with your mom, cya..
+ you're still here?
+ jesus loves you, but I ain't jesus. \002FUCK OFF\002
+:end

+ 6 - 0
src/Makefile.in

@@ -39,6 +39,7 @@ OBJS = auth.o \
 	misc.o \
 	misc_file.o \
 	net.o \
+	response.o \
 	rfc1459.o \
 	settings.o \
 	shell.o \
@@ -66,6 +67,11 @@ blah:
 	@echo "Use the build script."
 	@echo ""
 
+makeres: makeres.c
+	@echo -e "Compiling: \033[1mmakeres\033[0m"
+	@$(CC) $(CFLAGS) -I$(top_srcdir) -I$(top_srcdir)/pack $(CPPFLAGS) makeres.c -o makeres
+	@$(STRIP) makeres
+
 makehelp: makehelp.c
 	@echo -e "Compiling: \033[1mmakehelp\033[0m"
 	@$(CC) $(CFLAGS) -I$(top_srcdir) -I$(top_srcdir)/pack $(CPPFLAGS) makehelp.c -o makehelp

+ 2 - 2
src/cmds.c

@@ -2094,8 +2094,8 @@ static void cmd_timers(struct userrec *u, int idx, char *par)
 
       timer_info(ids[i], &name, &howlong, &trigger_time, &called);
       timer_diff(&mynow, &trigger_time, &diff);
-      egg_snprintf(interval, sizeof interval, "(%d.%d secs)", howlong.sec, howlong.usec);
-      egg_snprintf(next, sizeof next, "%d.%d secs", diff.sec, diff.usec);
+      egg_snprintf(interval, sizeof interval, "(%li.%li secs)", howlong.sec, howlong.usec);
+      egg_snprintf(next, sizeof next, "%li.%li secs", diff.sec, diff.usec);
       dprintf(idx, "%-2d: %-25s %-15s Next: %-25s Called: %d\n", i, name, interval, next, called);
     }
     free(ids);

+ 9 - 84
src/dcc.c

@@ -15,6 +15,7 @@
 #include "color.h"
 #include "salt.h"
 #include "net.h"
+#include "response.h"
 #include "misc.h"
 #include "users.h"
 #include "userrec.h"
@@ -61,82 +62,6 @@ static void dcc_telnet_hostresolved(int);
 static void dcc_telnet_got_ident(int, char *);
 static void dcc_telnet_pass(int, int);
 
-char *rand_dccresp()
-{
-  switch (randint(10)) { /* 0-5: random response, 6-9: none */
-  case 0:
-    return "sup\n";
-  case 1:
-    return "a/s/l?\ni'm 17/f/ca ;)\n";
-  case 2:
-    return "who are you?\n";
-  case 3:
-    return "uhhh do i know you?\n";
-  case 4:
-    return "what?\n";
-  case 5:
-    return "wtf do you want?\n";
-  case 6:
-    return "hold on a second, I am sort of busy..\n";
-  case 7:
-    return "mIRC v6.03 File Server\n\nUse: cd dir ls get read help exit\n[\\]\n";
-  case 8:
-    return "got any porn?\n";
-  case 9:
-    return "?\n";
-  default:
-    return "";
-    /* there's intentionally no newline in this response. You go figure out why :) */
-  }
-}
-
-char *rand_dccresppass()
-{
-  switch (randint(10)) { /* 0-5: random response, 6-9: none */
-  case 0:
-    return "what?\n";
-  case 1:
-    return "huh?\n";
-  case 2:
-    return "no.\n";
-  case 3:
-    return "thats great..\n";
-  case 4:
-    return "hmm, ok..I've got a better idea, check this out: http://peeldmonkeys.8k.com/images/keza-_middle_finger.jpg\n";
-  case 5:
-    return "I don't remember caring..\n";
-  case 6:
-    return "good for you.\n";
-  case 7:
-    return "I'm going to report you to the RIAA!!!\n";
-  default:
-    return "";
-  }
-}
-char *rand_dccrespbye()
-{
-  switch (randint(10)) { /* 0-5: random response, 6-9: none */
-  case 0:
-    return "stop wasting my time.\n";
-  case 1:
-    return "gtg\n";
-  case 2:
-    return "go away\n";
-  case 3:
-    return "fuck off already\n";
-  case 4:
-    return "ehh..no, bye.\n";
-  case 5:
-    return "hey I'm late for a date with your mom, cya..\n";
-  case 6:
-    return "you're still here?\n";
-  case 7:
-    return "jesus loves you, but I ain't jesus. \002FUCK OFF\002\n";
-  default:
-    return "";
-  }
-}
-
 static void strip_telnet(int sock, char *buf, int *len)
 {
   unsigned char *p = (unsigned char *) buf, *o = (unsigned char *) buf;
@@ -727,7 +652,7 @@ needed to login for now on.\n \n************************************************
       dcc_chatter(idx);
 #ifdef S_DCCAUTH
   } else {		/* bad auth */
-    dprintf(idx, "%s", rand_dccrespbye());
+    dprintf(idx, "%s", response(RES_BADUSERPASS));
     putlog(LOG_MISC, "*", DCC_BADAUTH, dcc[idx].nick,
 	   dcc[idx].host, dcc[idx].port);
     if (dcc[idx].u.chat->away) {	/* su from a dumb user */
@@ -789,7 +714,7 @@ static void dcc_chat_pass(int idx, char *buf, int atr)
     dcc_chat_secpass(idx, buf, atr);
 #endif /* S_DCCAUTH */
   } else {
-    dprintf(idx, "%s", rand_dccrespbye());
+    dprintf(idx, "%s", response(RES_BADUSERPASS));
     putlog(LOG_MISC, "*", DCC_BADLOGIN, dcc[idx].nick, dcc[idx].host, dcc[idx].port);
     if (dcc[idx].u.chat->away) {	/* su from a dumb user */
       /* Turn echo back on for telnet sessions (send IAC WON'T ECHO). */
@@ -1643,7 +1568,7 @@ static void dcc_telnet_pass(int idx, int atr)
 #ifdef HUB
     dprintf(idx, "\n%s" TLN_IAC_C TLN_WILL_C TLN_ECHO_C "\n", DCC_ENTERPASS);
 #else /* !HUB */
-    dprintf(idx, "%s" TLN_IAC_C TLN_WILL_C TLN_ECHO_C, rand_dccresppass());
+    dprintf(idx, "%s" TLN_IAC_C TLN_WILL_C TLN_ECHO_C, response(RES_PASSWORD));
 #endif /* HUB */
   }
 }
@@ -1773,12 +1698,12 @@ struct dcc_table DCC_IDENTWAIT =
 
 void dcc_ident(int idx, char *buf, int len)
 {
-  char response[512] = "", uid[512] = "", buf1[UHOSTLEN] = "";
+  char ident_response[512] = "", uid[512] = "", buf1[UHOSTLEN] = "";
   int i;
 
-  sscanf(buf, "%*[^:]:%[^:]:%*[^:]:%[^\n]\n", response, uid);
-  rmspace(response);
-  if (response[0] != 'U') {
+  sscanf(buf, "%*[^:]:%[^:]:%*[^:]:%[^\n]\n", ident_response, uid);
+  rmspace(ident_response);
+  if (ident_response[0] != 'U') {
     dcc[idx].timeval = now;
     return;
   }
@@ -1905,7 +1830,7 @@ static void dcc_telnet_got_ident(int i, char *host)
 #ifdef HUB
   dprintf(i, "\n");
 #else /* !HUB */
-  dprintf(i, "%s", rand_dccresp());
+  dprintf(i, "%s", response(RES_USERNAME));
 #endif /* HUB */
 }
 

+ 0 - 1
src/dcc.h

@@ -224,6 +224,5 @@ extern struct dcc_table DCC_CHAT, DCC_BOT, DCC_LOST, DCC_BOT_NEW,
 void send_timesync(int);
 void failed_link(int);
 void dupwait_notify(const char *);
-char *rand_dccresp();
 
 #endif /* !_DCC_H */

+ 3 - 1
src/main.c

@@ -12,6 +12,7 @@
 #include "binary.h"
 #include "dcc.h"
 #include "misc.h"
+#include "response.h"
 #include "thread.h"
 #include "settings.h"
 #include "misc_file.h"
@@ -718,7 +719,7 @@ int main(int argc, char **argv)
   egg_memcpy(&nowtm, localtime(&now), sizeof(struct tm));
 #endif /* S_UTCTIME */
   lastmin = nowtm.tm_min;
-  srandom(now % (getpid() + getppid()));
+  srandom(now % (getpid() + getppid()) * randint(1000));
   myuid = geteuid();
 
   binname = getfullbinname(argv[0]);
@@ -754,6 +755,7 @@ int main(int argc, char **argv)
   init_config();
   init_botcmd();
   init_conf();
+  init_responses();
 
   if (argc) {
     sdprintf("Calling dtx_arg with %d params.", argc);

+ 208 - 0
src/makeres.c

@@ -0,0 +1,208 @@
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+static char lower_resps[1024] = "";
+
+char *strtoupper(char *string)
+{
+  static char ret[51] = "";
+  int i = 0;
+
+  while (*string) {
+    ret[i] = toupper(*string);
+    i++;
+    string++;
+    ret[i] = 0;
+  }
+  return ret;
+}
+
+char *replace(char *string, char *oldie, char *newbie)
+{
+  static char newstring[1024] = "";
+  int str_index, newstr_index, oldie_index, end, new_len, old_len, cpy_len;
+  char *c = NULL;
+
+  if (string == NULL) return "";
+  if ((c = (char *) strstr(string, oldie)) == NULL) return string;
+  new_len = strlen(newbie);
+  old_len = strlen(oldie);
+  end = strlen(string) - old_len;
+  oldie_index = c - string;
+  newstr_index = 0;
+  str_index = 0;
+  while(str_index <= end && c != NULL) {
+    cpy_len = oldie_index-str_index;
+    strncpy(newstring + newstr_index, string + str_index, cpy_len);
+    newstr_index += cpy_len;
+    str_index += cpy_len;
+    strcpy(newstring + newstr_index, newbie);
+    newstr_index += new_len;
+    str_index += old_len;
+    if((c = (char *) strstr(string + str_index, oldie)) != NULL)
+     oldie_index = c - string;
+  }
+  strcpy(newstring + newstr_index, string + str_index);
+  return (newstring);
+}
+
+
+char *step_thru_file(FILE *fd)
+{
+  char tempBuf[1024] = "";
+  char *retStr = NULL;
+
+  if (fd == NULL) {
+    return NULL;
+  }
+  retStr = NULL;
+  while (!feof(fd)) {
+    fgets(tempBuf, sizeof(tempBuf), fd);
+    if (!feof(fd)) {
+      if (retStr == NULL) {
+        retStr = calloc(1, strlen(tempBuf) + 2);
+        strcpy(retStr, tempBuf);
+      } else {
+        retStr = realloc(retStr, strlen(retStr) + strlen(tempBuf));
+        strcat(retStr, tempBuf);
+      }
+      if (retStr[strlen(retStr)-1] == '\n') {
+        retStr[strlen(retStr)-1] = 0;
+        break;
+      }
+    }
+  }
+  return retStr;
+}
+
+char *newsplit(char **rest)
+{
+  register char *o, *r;
+
+  if (!rest)
+    return *rest = "";
+  o = *rest;
+  while (*o == ' ')
+    o++;
+  r = o;
+  while (*o && (*o != ' '))
+    o++;
+  if (*o)
+    *o++ = 0;
+  *rest = o;
+  return r;
+}
+
+int skipline (char *line, int *skip) {
+  static int multi = 0;
+  if ((!strncmp(line, "//", 2))) {
+    (*skip)++;
+  } else if ( (strstr(line, "/*")) && (strstr(line, "*/")) ) {
+    multi = 0;
+    (*skip)++;
+  } else if ( (strstr(line, "/*")) ) {
+    (*skip)++;
+    multi = 1;
+  } else if ( (strstr(line, "*/")) ) {
+    multi = 0;
+  } else {
+    if (!multi) (*skip) = 0;
+  }
+  return (*skip);
+}
+
+int parse_res(char *in, char *out, char *outs) {
+  FILE *inf = NULL, *outf = NULL, *outsf = NULL;
+  char *buffer = NULL, *cmd = NULL;
+  int skip = 0, line = 0, total_responses = 0;
+
+  if (!(inf = fopen(in, "r"))) {
+    printf("Error: Cannot open '%s' for reading\n", in);
+    return 1;
+  }
+  if (!(outf = fopen(out, "w"))) {
+    printf("Error: Cannot open '%s' for writing\n", out);
+    return 1;
+  }
+  if (!(outsf = fopen(outs, "w"))) {
+    printf("Error: Cannot open '%s' for writing\n", outs);
+    return 1;
+  }
+  printf("Parsing res file '%s'", in);
+
+  fprintf(outf, "/* DO NOT EDIT THIS FILE. */\n\
+#ifndef _RESPONSE_H\n\
+#define _RESPONSE_H\n\
+\n\
+char *response(int);\n\
+void init_responses();\n\n\
+enum {\n");
+
+  fprintf(outsf, "/* DO NOT EDIT THIS FILE. */\n\
+#ifndef _RESPONSES_H\n\
+#define _RESPONSES_H\n\
+\n\
+typedef char * res_t;\n\n");
+
+  while ((!feof(inf)) && ((buffer = step_thru_file(inf)) != NULL) ) {
+    line++;
+    if ((*buffer)) {
+      if (strchr(buffer, '\n')) *(char*)strchr(buffer, '\n') = 0;
+      if ((skipline(buffer, &skip))) continue;
+      if (buffer[0] == ':') { /* New cmd */
+        char *p = NULL;
+
+        if (cmd && cmd[0]) {		/* CLOSE LAST RES */
+          fprintf(outf, ",\n");	/* for enum */
+          fprintf(outsf, "\tNULL\n};\n\n");
+          free(cmd);
+        }
+        p = strchr(buffer, ':');
+        p++;
+        if (strcmp(p, "end")) {		/* NEXT RES */
+          cmd = calloc(1, strlen(p) + 1);
+
+          total_responses++;
+          strcpy(cmd, p);
+          printf(".");
+
+          fprintf(outf, "\tRES_%s", strtoupper(cmd));
+          if (total_responses == 1)
+            fprintf(outf, " = 1");
+          fprintf(outsf, "static res_t res_%s[] = {\n", cmd);
+          sprintf(lower_resps, "%s,\n\tres_%s", lower_resps, cmd);
+        } else {			/* END */
+          fprintf(outf, "};\n\n#define RES_TYPES %d\n\n#endif /* !_RESPONSE_H */\n", total_responses);
+          fprintf(outsf, "static res_t *res[] = {\n\tNULL%s\n};\n#endif /* !_RESPONSES_H */\n", lower_resps);
+        }
+      } else {				/* NEXT RES TEXT */
+        buffer++;
+        fprintf(outsf, "\t\"%s\",\n", buffer);
+/*        fprintf(outf, "%s\\n", replace(buffer, "\"", "\\\"")); */
+      }
+    }
+    buffer = NULL;
+  }
+//  fprintf(outf, "#endif /* HELP_H */\n");
+  printf(" Success\n");
+  if (inf) fclose(inf);
+  if (outf) fclose(outf);
+  if (outsf) fclose(outsf);
+  return 0;
+}
+
+int main(int argc, char **argv) {
+  char *in = NULL, out[1024] = "", outs[1024] = "";
+  int ret = 0;
+
+  if (argc < 3) return 1;
+  in = calloc(1, strlen(argv[1]) + 1);
+  strcpy(in, argv[1]);
+  sprintf(out, "%s/response.h%s", argv[2], argc == 4 ? "~" : "");
+  sprintf(outs, "%s/responses.h%s", argv[2], argc == 4 ? "~" : "");
+  ret = parse_res(in, out, outs);
+  free(in);
+  return ret;
+}

+ 0 - 148
src/misc.c

@@ -797,154 +797,6 @@ int bot_aggressive_to(struct userrec *u)
     return 0;
 }
 
-char kickprefix[25] = "";
-char bankickprefix[25] = "";
-
-char *kickreason(int kind) {
-  switch (kind) {
-  case KICK_BANNED:
-    switch (randint(6)) {
-    case 0: return "bye";
-    case 1: return "banned";
-    case 2: return "see you in hell";
-    case 3: return "go away";
-    case 4: return "cya around lewser";
-    case 5: return "unwanted!";
-    }
-  case KICK_KUSER:
-    switch (randint(4)) {
-    case 0: return "not wanted";
-    case 1: return "something tells me you're annoying";
-    case 2: return "don't bug me lewser";
-    case 3: return "creep";
-    }
-  case KICK_KICKBAN:
-    switch (randint(4)) {
-    case 0: return "gone";
-    case 1: return "stupid";
-    case 2: return "lewser";
-    case 3: return "...";
-    }     
-  case KICK_MASSDEOP:
-    switch (randint(8)) {
-    case 0: return "spammer!";
-    case 1: return "easy on the modes now";
-    case 2: return "mode this";
-    case 3: return "nice try";
-    case 4: return "really?";
-    case 5: return "you lose";
-    case 6: return "scary... really scary...";
-    case 7: return "i win kthx";
-    }
-  case KICK_BADOP:
-    switch (randint(5)) {
-    case 0: return "neat...";
-    case 1: return "oh, no you don't. go away.";
-    case 2: return "didn't you forget something now?";
-    case 3: return "no";
-    case 4: return "hijack this";
-    }
-  case KICK_BADOPPED:
-    switch (randint(5)) {
-    case 0: return "fuck off kid";
-    case 1: return "asl?";
-    case 2: return "whoa... what a hacker... skills!";
-    case 3: return "yes! yes! yes! hit me baby one more time!";
-    case 4: return "with your skills, you're better off jacking off than hijacking";
-    }
-  case KICK_MANUALOP:
-    switch (randint(6)) {
-    case 0: return "naughty kid";
-    case 1: return "didn't someone tell you that is bad?";
-    case 2: return "want perm?";
-    case 3: return "see how much good that did you?";
-    case 4: return "not a smart move...";
-    case 5: return "jackass!";
-    }
-  case KICK_MANUALOPPED:
-    switch (randint(8)) {
-    case 0: return "your pal got mean friends. like me.";
-    case 1: return "uhh now.. don't wake me up...";
-    case 2: return "hi hun. missed me?";
-    case 3: return "spammer! die!";
-    case 4: return "boo!";
-    case 5: return "that @ was useful, don't ya think?";
-    case 6: return "not in my book";
-    case 7: return "lol, really?";
-    }
-  case KICK_CLOSED:
-    switch (randint(17)) {
-    case 0: return "locked";
-    case 1: return "later";
-    case 2: return "closed for now";
-    case 3: return "come back later";
-    case 4: return "better safe than sorry";
-    case 5: return "cleanup, come back later";
-    case 6: return "this channel is closed";
-    case 7: return "shutting down for now";
-    case 8: return "lockdown";
-    case 9: return "reopening later";
-    case 10: return "not for the public atm";
-    case 11: return "private channel for now";
-    case 12: return "might reopen soon, might reopen later";
-    case 13: return "you're not supposed to be here right now";
-    case 14: return "sorry, closed";
-    case 15: return "try us later, atm we're locked down";
-    case 16: return "closed. try tomorrow";
-    }
-  case KICK_FLOOD:
-    switch (randint(7)) {
-    case 0: return "so much bullshit in such a short time. amazing.";
-    case 1: return "slow down. i'm trying to read here.";
-    case 2: return "uhm... you actually think irc is for talking?";
-    case 3: return "talk talk talk";
-    case 4: return "blabbering are we?";
-    case 5: return "... and i don't even like you!";
-    case 6: return "and you're outa here...";
-
-    }
-  case KICK_NICKFLOOD:
-    switch (randint(7)) {
-    case 0: return "make up your mind?";
-    case 1: return "be schizofrenic elsewhere";
-    case 2: return "I'm loosing track of you... not!";
-    case 3: return "that is REALLY annoying";
-    case 4: return "try this: /NICK n00b";
-    case 5: return "playing hide 'n' seek?";
-    case 6: return "gotcha!";
-    }
-  case KICK_KICKFLOOD:
-    switch (randint(6)) {
-    case 0: return "easier to just leave if you wan't to be alone";
-    case 1: return "cool down";
-    case 2: return "don't be so damned aggressive. that's my job.";
-    case 3: return "kicking's fun, isn't it?";
-    case 4: return "what's the rush?";
-    case 5: return "next time you do that, i'll kick you again";
-    }
-  case KICK_BOGUSUSERNAME:
-    return "bogus username";
-  case KICK_MEAN:
-    switch (randint(11)) {
-    case 0: return "hey! that wasn't very nice!";
-    case 1: return "don't fuck with my pals";
-    case 2: return "meanie!";
-    case 3: return "I can be a bitch too...";
-    case 4: return "leave the bots alone, will ya?";
-    case 5: return "not very clever";
-    case 6: return "watch it";
-    case 7: return "fuck off";
-    case 8: return "easy now. that's a friend.";
-    case 9: return "abuse of power. leave that to me, will ya?";      
-    case 10: return "there as some things you cannot do, and that was one of them...";
-    }
-  case KICK_BOGUSKEY:
-    return "I have a really hard time reading that key";
-  default:
-    return "OMFG@YUO";    
-  }
-}
-
 /*
    plain cookie:
    Last 6 digits of time

+ 0 - 18
src/misc.h

@@ -12,22 +12,6 @@
 #define LOG_TS "[%H:%M]"
 
 
-#define KICK_BANNED 		1
-#define KICK_KUSER 		2
-#define KICK_KICKBAN 		3
-#define KICK_MASSDEOP 		4
-#define KICK_BADOP 		5
-#define KICK_BADOPPED 		6
-#define KICK_MANUALOP 		7
-#define KICK_MANUALOPPED	8
-#define KICK_CLOSED		9
-#define KICK_FLOOD 		10
-#define KICK_NICKFLOOD 		11
-#define KICK_KICKFLOOD 		12
-#define KICK_BOGUSUSERNAME 	13
-#define KICK_MEAN 		14
-#define KICK_BOGUSKEY 		15
-
 char *wbanner();
 int coloridx(int);
 char *color(int, int, int);
@@ -37,7 +21,6 @@ int listen_all(int, int);
 char *replace(const char *, const char *, const char *);
 int goodpass(char *, int, char *);
 void makeplaincookie(char *, char *, char *);
-char *kickreason(int);
 int bot_aggressive_to(struct userrec *);
 int updatebin(int, char *, int);
 int egg_strcatn(char *dst, const char *src, size_t max);
@@ -64,7 +47,6 @@ inline void str_unescape(char *, register const char);
 int str_isdigit(const char *);
 void kill_bot(char *, char *);
 
-extern char		kickprefix[], bankickprefix[];
 extern int		server_lag, use_invites, use_exempts;
 
 #endif /* !_MISC_H_ */

+ 3 - 0
src/mod/ctcp.mod/ctcp.c

@@ -42,6 +42,9 @@ char cloak_host[161] = "";
 char ctcpversion[400] = "";
 char ctcpuserinfo[400] = "";
 char autoaway[100] = "";
+char kickprefix[25] = "";
+char bankickprefix[25] = "";
+
 
 char *strtolower(char *s)
 {

+ 4 - 0
src/mod/ctcp.mod/ctcp.h

@@ -35,4 +35,8 @@
 
 void ctcp_init();
 
+#ifdef LEAF
+extern char		kickprefix[], bankickprefix[];
+#endif /* LEAF */
+
 #endif				/* _EGG_MOD_CTCP_CTCP_H */

+ 11 - 11
src/mod/irc.mod/chan.c

@@ -198,7 +198,7 @@ void priority_do(struct chanset_t * chan, int opsonly, int action)
             sent++;
             if (chan->closed_ban)
               doban(chan, m);
-            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, kickreason(KICK_CLOSED));
+            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, response(RES_CLOSED));
             m->flags |= SENTKICK;
             if (actions >= ct)
               return;
@@ -240,7 +240,7 @@ void priority_do(struct chanset_t * chan, int opsonly, int action)
             actions++;
             if (chan->closed_ban)
               doban(chan, m);
-            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, kickreason(KICK_CLOSED));
+            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, response(RES_CLOSED));
             m->flags |= SENTKICK;
             if ((actions >= ct) || (sent > 5))
               return;
@@ -443,7 +443,7 @@ static int detect_chan_flood(char *floodnick, char *floodhost, char *from,
       /* Flooding chan! either by public or notice */
       if (!chan_sentkick(m) && me_op(chan)) {
 	putlog(LOG_MODES, chan->dname, IRC_FLOODKICK, floodnick);
-        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, kickreason(KICK_FLOOD));
+        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, response(RES_FLOOD));
 	m->flags |= SENTKICK;
       }
       return 1;
@@ -479,7 +479,7 @@ static int detect_chan_flood(char *floodnick, char *floodhost, char *from,
    	        dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, m->nick,
 		      kickprefix, IRC_JOIN_FLOOD);
 	      else
-                dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, kickreason(KICK_NICKFLOOD));
+                dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, response(RES_NICKFLOOD));
 	    }
 	  }
 	}
@@ -487,7 +487,7 @@ static int detect_chan_flood(char *floodnick, char *floodhost, char *from,
     case FLOOD_KICK:
       if (me_op(chan) && !chan_sentkick(m)) {
 	putlog(LOG_MODES, chan->dname, "Kicking %s, for mass kick.", floodnick);
-        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, kickreason(KICK_KICKFLOOD));
+        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, response(RES_KICKFLOOD));
 	m->flags |= SENTKICK;
       }
     return 1;
@@ -495,7 +495,7 @@ static int detect_chan_flood(char *floodnick, char *floodhost, char *from,
       if (me_op(chan) && !chan_sentkick(m)) {
 	putlog(LOG_MODES, chan->dname,
 	       CHAN_MASSDEOP, chan->dname, from);
-        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, kickreason(KICK_MASSDEOP));
+        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, floodnick, kickprefix, response(RES_MASSDEOP));
 	m->flags |= SENTKICK;
       }
       if (u) {
@@ -953,7 +953,7 @@ static void check_this_member(struct chanset_t *chan, char *nick, struct flag_re
       check_exemptlist(chan, s);
       quickban(chan, m->userhost);
       p = get_user(&USERENTRY_COMMENT, m->user);
-      dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, p ? p : kickreason(KICK_KUSER));
+      dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, p ? p : response(RES_KUSER));
       m->flags |= SENTKICK;
     }
   }
@@ -1489,7 +1489,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *serve
       /* and it's not me, and i'm an op */
       !match_my_nick(nick) && me_op(chan)) {
     /*  && target_priority(chan, m, 0) */
-    dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, kickreason(KICK_BANNED));
+    dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, response(RES_BANNED));
     m->flags |= SENTKICK;
   }
   /* if the user is a +k */
@@ -1500,7 +1500,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *serve
            /* && target_priority(chan, m, 0) */
     /* cya later! */
     quickban(chan, userhost);
-    dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, kickreason(KICK_KUSER));
+    dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, response(RES_KUSER));
     m->flags |= SENTKICK;
   }
 
@@ -2224,7 +2224,7 @@ static int gotjoin(char *from, char *chname)
               me_op(chan)) {
             for (b = chan->channel.ban; b->mask[0]; b = b->next) {
               if (wild_match(b->mask, from)) {
-                dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chname, m->nick, bankickprefix, kickreason(KICK_BANNED));
+                dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chname, m->nick, bankickprefix, response(RES_BANNED));
                 m->flags |= SENTKICK;
                 goto exit;
               }
@@ -2240,7 +2240,7 @@ static int gotjoin(char *from, char *chname)
 	    check_exemptlist(chan, from);
 	    quickban(chan, from);
 	    p = get_user(&USERENTRY_COMMENT, m->user);
-            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chname, nick, bankickprefix, kickreason(KICK_KUSER));
+            dprintf(DP_MODE, "KICK %s %s :%s%s\n", chname, nick, bankickprefix, response(RES_KUSER));
 	    m->flags |= SENTKICK;
 	  }
 	}

+ 3 - 1
src/mod/irc.mod/irc.c

@@ -15,6 +15,7 @@
 #include "src/botnet.h"
 #include "src/botmsg.h"
 #include "src/main.h"
+#include "src/response.h"
 #include "src/cfg.h"
 #include "src/userrec.h"
 #include "src/misc.h"
@@ -29,6 +30,7 @@
 #include "src/mod/share.mod/share.h"
 #include "src/mod/server.mod/server.h"
 #include "src/mod/channels.mod/channels.h"
+#include "src/mod/ctcp.mod/ctcp.h"
 
 #include <stdarg.h>
 
@@ -750,7 +752,7 @@ static void punish_badguy(struct chanset_t *chan, char *whobad,
       !chan_sentkick(m) &&
       /* ... and can I actually do anything about it? */
       me_op(chan) && !mevictim) {
-    dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, kickreason(KICK_MEAN));
+    dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, response(RES_MEAN));
     m->flags |= SENTKICK;
   }
 }

+ 8 - 8
src/mod/irc.mod/mode.c

@@ -618,7 +618,7 @@ static void got_ban(struct chanset_t *chan, char *nick, char *from, char *who)
 	}
       }
     }
-    kick_all(chan, who, resn[0] ? resn : kickreason(KICK_BANNED), match_my_nick(nick) ? 0 : 1);
+    kick_all(chan, who, resn[0] ? resn : response(RES_BANNED), match_my_nick(nick) ? 0 : 1);
   }
   if (!nick[0] && (bounce_bans || bounce_modes) &&
       (!u_equals_mask(global_bans, who) || !u_equals_mask(chan->bans, who)))
@@ -880,7 +880,7 @@ static int gotmode(char *from, char *msg)
             m = ismember(chan, nfrom);
             if (m && !chan_sentkick(m)) {
               m->flags |= SENTKICK;
-              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, kickreason(KICK_MASSDEOP));
+              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, response(RES_MASSDEOP));
               tputs(serv, tmp, strlen(tmp));
               if (ufrom) {
                 sprintf(tmp, "Mass deop on %s by %s", chan->dname, nfrom);
@@ -899,7 +899,7 @@ static int gotmode(char *from, char *msg)
               m = ismember(chan, nfrom);
               if (m && !chan_sentkick(m)) {
                 m->flags |= SENTKICK;
-                sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, kickreason(KICK_MANUALOP));
+                sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, response(RES_MANUALOP));
                 tputs(serv, tmp, strlen(tmp));
                 if (ufrom) {
                   sprintf(tmp, "Mass op on %s by %s", chan->dname, nfrom);
@@ -966,7 +966,7 @@ static int gotmode(char *from, char *msg)
             /* Kick opper */
             m = ismember(chan, nfrom);
             if (!m || !chan_sentkick(m)) {
-              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, kickreason(KICK_BADOP));
+              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, response(RES_BADOP));
               tputs(serv, tmp, strlen(tmp));
               if (m)
                 m->flags |= SENTKICK;
@@ -989,7 +989,7 @@ static int gotmode(char *from, char *msg)
               if (m) {
                 if (!(m->flags & CHANOP)) {
                   if (!chan_sentkick(m)) {
-                    sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, kickreason(KICK_BADOPPED));
+                    sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, response(RES_BADOPPED));
                     tputs(serv, tmp, strlen(tmp));
                     m->flags |= SENTKICK;
                   }
@@ -1022,7 +1022,7 @@ static int gotmode(char *from, char *msg)
           /* Kick opper */
           m = ismember(chan, nfrom);
           if (!m || !chan_sentkick(m)) {
-            sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, kickreason(KICK_MANUALOP));
+            sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, nfrom, kickprefix, response(RES_MANUALOP));
             tputs(serv, tmp, strlen(tmp));
             if (m)
               m->flags |= SENTKICK;
@@ -1045,13 +1045,13 @@ static int gotmode(char *from, char *msg)
             if (m) {
               if (!(m->flags & CHANOP) && (rfc_casecmp(botname, trg))) {
                 if (!chan_sentkick(m)) {
-                  sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, kickreason(KICK_MANUALOPPED));
+                  sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, response(RES_MANUALOPPED));
                   tputs(serv, tmp, strlen(tmp));
                   m->flags |= SENTKICK;
                 }
               }
             } else {
-              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, kickreason(KICK_MANUALOPPED));
+              sprintf(tmp, "KICK %s %s :%s%s\n", chan->name, trg, kickprefix, response(RES_MANUALOPPED));
               tputs(serv, tmp, strlen(tmp));
             }
           }

+ 2 - 1
src/mod/server.mod/server.c

@@ -14,6 +14,7 @@
 #include "src/users.h"
 #include "src/userrec.h"
 #include "src/main.h"
+#include "src/response.h"
 #include "src/misc.h"
 #include "src/chanprog.h"
 #include "src/net.h"
@@ -952,7 +953,7 @@ static void dcc_chat_hostresolved(int i)
     dcc[i].timeval = now;
     /* Ok, we're satisfied with them now: attempt the connect */
     putlog(LOG_MISC, "*", "DCC connection: CHAT (%s!%s)", dcc[i].nick, dcc[i].host);
-    dprintf(i, "%s", rand_dccresp());
+    dprintf(i, "%s", response(RES_USERNAME));
   }
   return;
 }

+ 47 - 0
src/response.c

@@ -0,0 +1,47 @@
+/*
+ * response.c -- handles:
+ *
+ *   What else?!
+ *
+ */
+
+#include "common.h"
+#include "response.h"
+#include "main.h"
+#include "responses.h"
+
+static int response_totals[RES_TYPES];
+
+void
+init_responses()
+{
+  unsigned int i = 0;
+  
+  for (i = 0; i <= RES_TYPES; i++)
+    response_totals[i] = 0;
+}
+
+static void
+count_responses(int type)
+{
+  unsigned int total = 0;
+
+  for (total = 0; res[type][total]; total++) 
+    ;
+
+  response_totals[type] = total;
+  /* printf("Type: %d has %d total responses!\n", type, response_totals[type]); */
+}
+
+char *
+response(int type)
+{
+  if (!type)
+    type = randint(RES_TYPES) + 1;
+
+  /* wait to count the totals until it's used for the first time */
+  if (!response_totals[type])
+    count_responses(type);
+
+  return res[type][randint(response_totals[type])];
+}