-/* qabot.h */\r
-#ifndef _QABOT_H\r
-#define _QABOT_H\r
-\r
-#define QABOT_NICK "QABot"\r
-#define QABOT_USER "qabot"\r
-#define QABOT_HOST "quakenet.org"\r
-#define QABOT_NAME "Question & Answer Bot v1.0"\r
-#define QABOT_ACCT "QABot"\r
-#define QABOT_UMDE UMODE_SERVICE|UMODE_OPER|UMODE_INV|UMODE_ACCOUNT\r
-#define QABOT_CHILD_UMODE UMODE_INV\r
-#define TUTOR_NAME "#tutorial bot"\r
-#define TUTOR_ACCOUNT "Tutor"\r
-\r
-#define QABOT_HOMECHAN "#qnet.pr"\r
-\r
-#define QAUFLAG_STAFF 0x01\r
-#define QAUFLAG_ADMIN 0x02\r
-#define QAUFLAG_DEVELOPER 0x04\r
-\r
-#define QAIsStaff(x) ((x)->flags & (QAUFLAG_STAFF|QAUFLAG_ADMIN|QAUFLAG_DEVELOPER))\r
-#define QAIsAdmin(x) ((x)->flags & (QAUFLAG_ADMIN|QAUFLAG_DEVELOPER))\r
-#define QAIsDeveloper(x) ((x)->flags & QAUFLAG_DEVELOPER)\r
-\r
-#define QUESTIONINTERVAL 30\r
-#define SPAMINTERVAL 10\r
-#define ASKWAIT 30\r
-#define QUEUEDQUESTIONINTERVAL 2\r
-#define QUESTIONHASHSIZE 1000\r
-\r
-#define QABOT_SAVEWAIT 3600\r
-\r
-#define QABOT_MICTIMEOUT 180\r
-\r
-#define QAB_CONTROLCHAR 0x01\r
-#define QAB_COLOUR 0x02\r
-#define QAB_AUTHEDONLY 0x04\r
-#define QAB_LINEBREAK 0x08\r
-#define QAB_FLOODDETECT 0x10\r
-#define QAB_FLOODSTOP 0x20\r
-#define QAB_BLOCKMARK 0x40\r
-/*#define QAB_\r
-#define QAB_*/\r
-\r
-#define QABBLOCK_ACCOUNT 0\r
-#define QABBLOCK_HOST 1\r
-#define QABBLOCK_TEXT 2\r
-\r
-#define QAQ_NEW 0x00\r
-#define QAQ_ANSWERED 0x01\r
-#define QAQ_OFFTOPIC 0x02\r
-#define QAQ_SPAM 0x03\r
-#define QAQ_QSTATE 0x07\r
-\r
-#define QAC_QUESTIONCHAN 0x01\r
-#define QAC_STAFFCHAN 0x02\r
-\r
-#define DEFAULTBOTFLAGS QAB_CONTROLCHAR|QAB_COLOUR|QAB_LINEBREAK|QAB_FLOODSTOP\r
-\r
-typedef struct qab_user {\r
- char authname[ACCOUNTLEN + 1];\r
- flag_t flags;\r
- time_t created;\r
-\r
- struct qab_user* next;\r
- struct qab_user* prev;\r
-} qab_user;\r
-\r
-typedef struct qab_spam {\r
- char* message;\r
- \r
- struct qab_spam* next;\r
-} qab_spam;\r
-\r
-typedef struct qab_question {\r
- int id;\r
- char* question;\r
- flag_t flags;\r
- char nick[NICKLEN + 1];\r
- unsigned long numeric;\r
- unsigned long crc;\r
- char* answer;\r
- \r
- struct qab_question* next;\r
-} qab_question;\r
-\r
-typedef struct qab_answer {\r
- qab_question* question;\r
- char nick[NICKLEN + 1];\r
- \r
- struct qab_answer* next;\r
-} qab_answer;\r
-\r
-typedef struct qab_block {\r
- char type;\r
- char creator[ACCOUNTLEN + 1];\r
- time_t created;\r
- char* blockstr;\r
-\r
- struct qab_block* next;\r
- struct qab_block* prev;\r
-} qab_block;\r
-\r
-typedef struct qab_bot {\r
- char nick[NICKLEN + 1];\r
- char user[USERLEN + 1];\r
- char* host;\r
- \r
- nick* np;\r
- \r
- chanindex* public_chan;\r
- chanindex* question_chan;\r
- chanindex* staff_chan;\r
- \r
- flag_t flags;\r
- \r
- /*int question_interval;*/\r
- int spam_interval;\r
- int ask_wait;\r
- int queued_question_interval;\r
- \r
- time_t lastmic;\r
- int mic_timeout;\r
- \r
- qab_block* blocks;\r
- int block_count;\r
- \r
- qab_question* questions[QUESTIONHASHSIZE];\r
- int lastquestionID;\r
- int answered;\r
- \r
- int spammed;\r
- \r
- qab_spam* nextspam;\r
- qab_spam* lastspam;\r
- time_t spamtime;\r
- \r
- qab_answer* answers;\r
- \r
- unsigned long micnumeric;\r
-\r
- struct qab_bot* next;\r
- struct qab_bot* prev;\r
-} qab_bot;\r
-\r
-extern time_t qab_startime;\r
-extern int qabot_nickext;\r
-extern int qabot_spam_nickext;\r
-extern int qabot_chanext;\r
-extern nick* qabot_nick;\r
-extern CommandTree* qabot_commands;\r
-extern qab_user* qabot_users;\r
-extern qab_bot* qab_bots;\r
-extern unsigned long qab_lastq_crc;\r
-extern int qab_lastq_count;\r
-\r
-/* qabot.c */\r
-void qabot_lostnick(int hooknum, void* arg);\r
-void qabot_channel_part(int hooknum, void* arg);\r
-void qabot_createfakeuser(void* arg);\r
-void qabot_handler(nick* me, int type, void** args);\r
-void qabot_child_handler(nick* me, int type, void** args);\r
-char* qabot_getvictim(nick* np, char* target);\r
-const char* qabot_uflagtostr(flag_t flags);\r
-const char* qabot_formattime(time_t tme);\r
-\r
-/* qabot_bot.c */\r
-qab_bot* qabot_getbot();\r
-int qabot_addbot(char* nickname, char* user, char* host, char* pub_chan, char* qu_chan, char* stff_chan, flag_t flags, int spam_interval, int ask_wait, int queued_question_interval, nick* sender);\r
-void qabot_delbot(qab_bot* bot);\r
-channel* qabot_getchannel(char* channel_name);\r
-void qabot_spam(void* arg);\r
-void qabot_spamstored(void* arg);\r
-void qabot_createbotfakeuser(void* arg);\r
-qab_bot* qabot_getcurrentbot();\r
-channel* qabot_getcurrentchannel();\r
-void qabot_timer(void* arg);\r
-\r
-/* qabot_chancommands.c */\r
-int qabot_dochananswer(void* np, int cargc, char** cargv);\r
-int qabot_dochanblock(void* np, int cargc, char** cargv);\r
-int qabot_dochanclear(void* np, int cargc, char** cargv);\r
-int qabot_dochanclosechan(void* np, int cargc, char** cargv);\r
-int qabot_dochanconfig(void* np, int cargc, char** cargv);\r
-int qabot_dochanhelp(void* np, int cargc, char** cargv);\r
-int qabot_dochanlistblocks(void* np, int cargc, char** cargv);\r
-int qabot_dochanmic(void* np, int cargc, char** cargv);\r
-int qabot_dochanmoo(void* np, int cargc, char** cargv);\r
-int qabot_dochanofftopic(void* np, int cargc, char** cargv);\r
-int qabot_dochanopenchan(void* np, int cargc, char** cargv);\r
-int qabot_dochanping(void* np, int cargc, char** cargv);\r
-int qabot_dochanreset(void* np, int cargc, char** cargv);\r
-int qabot_dochanspam(void* np, int cargc, char** cargv);\r
-int qabot_dochanstatus(void* np, int cargc, char** cargv);\r
-int qabot_dochanunblock(void* np, int cargc, char** cargv);\r
-\r
-/* qabot_commands.c */\r
-int qabot_doshowcommands(void* sender, int cargc, char** cargv);\r
-int qabot_dohelp(void* sender, int cargc, char** cargv);\r
-int qabot_dohello(void* sender, int cargc, char** cargv);\r
-int qabot_dosave(void* sender, int cargc, char** cargv);\r
-int qabot_dolistbots(void* sender, int cargc, char** cargv);\r
-int qabot_dolistusers(void* sender, int cargc, char** cargv);\r
-int qabot_doshowbot(void* sender, int cargc, char** cargv);\r
-int qabot_doaddbot(void* sender, int cargc, char** cargv);\r
-int qabot_dodelbot(void* sender, int cargc, char** cargv);\r
-int qabot_doadduser(void* sender, int cargc, char** cargv);\r
-int qabot_dodeluser(void* sender, int cargc, char** cargv);\r
-int qabot_dochangelev(void* sender, int cargc, char** cargv);\r
-int qabot_dowhois(void* sender, int cargc, char** cargv);\r
-int qabot_dostatus(void* sender, int cargc, char** cargv);\r
-\r
-/* qabot_dbase.c */\r
-void qabot_loaddb();\r
-void qabot_savedb();\r
-void qabot_savetimer(void* arg);\r
-void qabot_adduser(const char* authname, flag_t flags, time_t created);\r
-void qabot_deluser(const char* authname);\r
-void qabot_squelchuser(qab_user* user);\r
-qab_user* qabot_getuser(const char* authname);\r
-\r
-/* qabot_help.c */\r
-int qabot_showhelp(nick* np, char* arg);\r
-\r
-#endif\r
+/* qabot.h */
+#ifndef _QABOT_H
+#define _QABOT_H
+
+#include <string.h>
+
+#if !defined(strdup)
+char *strdup(const char *);
+#endif
+
+#define QABOT_NICK "QABot"
+#define QABOT_USER "qabot"
+#define QABOT_HOST "quakenet.org"
+#define QABOT_NAME "Question & Answer Bot v1.0"
+#define QABOT_ACCT "QABot"
+#define QABOT_UMDE UMODE_SERVICE|UMODE_OPER|UMODE_INV|UMODE_ACCOUNT
+#define QABOT_CHILD_UMODE UMODE_INV
+#define TUTOR_NAME "#tutorial bot"
+#define TUTOR_ACCOUNT "Tutor"
+
+#define QABOT_HOMECHAN "#qnet.pr"
+
+#define QAUFLAG_STAFF 0x01
+#define QAUFLAG_ADMIN 0x02
+#define QAUFLAG_DEVELOPER 0x04
+
+#define QAIsStaff(x) ((x)->flags & (QAUFLAG_STAFF|QAUFLAG_ADMIN|QAUFLAG_DEVELOPER))
+#define QAIsAdmin(x) ((x)->flags & (QAUFLAG_ADMIN|QAUFLAG_DEVELOPER))
+#define QAIsDeveloper(x) ((x)->flags & QAUFLAG_DEVELOPER)
+
+#define QUESTIONINTERVAL 30
+#define SPAMINTERVAL 10
+#define ASKWAIT 30
+#define QUEUEDQUESTIONINTERVAL 2
+#define QUESTIONHASHSIZE 1000
+
+#define QABOT_SAVEWAIT 3600
+
+#define QABOT_MICTIMEOUT 180
+
+#define QAB_CONTROLCHAR 0x01
+#define QAB_COLOUR 0x02
+#define QAB_AUTHEDONLY 0x04
+#define QAB_LINEBREAK 0x08
+#define QAB_FLOODDETECT 0x10
+#define QAB_FLOODSTOP 0x20
+#define QAB_BLOCKMARK 0x40
+/*#define QAB_
+#define QAB_*/
+
+#define QABBLOCK_ACCOUNT 0
+#define QABBLOCK_HOST 1
+#define QABBLOCK_TEXT 2
+
+#define QAQ_NEW 0x00
+#define QAQ_ANSWERED 0x01
+#define QAQ_OFFTOPIC 0x02
+#define QAQ_SPAM 0x03
+#define QAQ_QSTATE 0x07
+
+#define QAC_QUESTIONCHAN 0x01
+#define QAC_STAFFCHAN 0x02
+
+#define DEFAULTBOTFLAGS QAB_CONTROLCHAR|QAB_COLOUR|QAB_LINEBREAK|QAB_FLOODSTOP
+
+typedef struct qab_user {
+ char authname[ACCOUNTLEN + 1];
+ flag_t flags;
+ time_t created;
+
+ struct qab_user* next;
+ struct qab_user* prev;
+} qab_user;
+
+typedef struct qab_spam {
+ char* message;
+
+ struct qab_spam* next;
+} qab_spam;
+
+typedef struct qab_question {
+ int id;
+ char* question;
+ flag_t flags;
+ char nick[NICKLEN + 1];
+ unsigned long numeric;
+ unsigned long crc;
+ char* answer;
+
+ struct qab_question* next;
+} qab_question;
+
+typedef struct qab_answer {
+ qab_question* question;
+ char nick[NICKLEN + 1];
+
+ struct qab_answer* next;
+} qab_answer;
+
+typedef struct qab_block {
+ char type;
+ char creator[ACCOUNTLEN + 1];
+ time_t created;
+ char* blockstr;
+
+ struct qab_block* next;
+ struct qab_block* prev;
+} qab_block;
+
+typedef struct qab_bot {
+ char nick[NICKLEN + 1];
+ char user[USERLEN + 1];
+ char* host;
+
+ nick* np;
+
+ chanindex* public_chan;
+ chanindex* question_chan;
+ chanindex* staff_chan;
+
+ flag_t flags;
+
+ /*int question_interval;*/
+ int spam_interval;
+ int ask_wait;
+ int queued_question_interval;
+
+ time_t lastmic;
+ int mic_timeout;
+
+ qab_block* blocks;
+ int block_count;
+
+ qab_question* questions[QUESTIONHASHSIZE];
+ int lastquestionID;
+ int answered;
+
+ int spammed;
+
+ qab_spam* nextspam;
+ qab_spam* lastspam;
+ time_t spamtime;
+
+ qab_answer* answers;
+
+ unsigned long micnumeric;
+ unsigned long recnumeric;
+ FILE *recfile;
+ FILE *playfile;
+
+ struct qab_bot* next;
+ struct qab_bot* prev;
+} qab_bot;
+
+extern time_t qab_startime;
+extern int qabot_nickext;
+extern int qabot_spam_nickext;
+extern int qabot_chanext;
+extern nick* qabot_nick;
+extern CommandTree* qabot_commands;
+extern qab_user* qabot_users;
+extern qab_bot* qab_bots;
+extern unsigned long qab_lastq_crc;
+extern int qab_lastq_count;
+
+/* qabot.c */
+void qabot_lostnick(int hooknum, void* arg);
+void qabot_channel_part(int hooknum, void* arg);
+void qabot_createfakeuser(void* arg);
+void qabot_handler(nick* me, int type, void** args);
+void qabot_child_handler(nick* me, int type, void** args);
+char* qabot_getvictim(nick* np, char* target);
+const char* qabot_uflagtostr(flag_t flags);
+const char* qabot_formattime(time_t tme);
+
+/* qabot_bot.c */
+qab_bot* qabot_getbot();
+int qabot_addbot(char* nickname, char* user, char* host, char* pub_chan, char* qu_chan, char* stff_chan, flag_t flags, int spam_interval, int ask_wait, int queued_question_interval, nick* sender);
+void qabot_delbot(qab_bot* bot);
+void qabot_playback(qab_bot *bot);
+channel* qabot_getchannel(char* channel_name);
+void qabot_spam(void* arg);
+void qabot_spamstored(void* arg);
+void qabot_createbotfakeuser(void* arg);
+qab_bot* qabot_getcurrentbot();
+channel* qabot_getcurrentchannel();
+void qabot_timer(void* arg);
+
+/* qabot_chancommands.c */
+int qabot_dochananswer(void* np, int cargc, char** cargv);
+int qabot_dochanblock(void* np, int cargc, char** cargv);
+int qabot_dochanclear(void* np, int cargc, char** cargv);
+int qabot_dochanclosechan(void* np, int cargc, char** cargv);
+int qabot_dochanconfig(void* np, int cargc, char** cargv);
+int qabot_dochanhelp(void* np, int cargc, char** cargv);
+int qabot_dochanlistblocks(void* np, int cargc, char** cargv);
+int qabot_dochanmic(void* np, int cargc, char** cargv);
+int qabot_dochanrecord(void *np, int cargc, char** cargv);
+int qabot_dochanplay(void *np, int cargc, char** cargv);
+int qabot_dochancontinue(void *np, int cargc, char** cargv);
+int qabot_dochanstop(void *np, int cargc, char** cargv);
+int qabot_dochanlist(void *np, int cargc, char** cargv);
+int qabot_dochandelete(void *np, int cargc, char** cargv);
+int qabot_dochanmoo(void* np, int cargc, char** cargv);
+int qabot_dochanofftopic(void* np, int cargc, char** cargv);
+int qabot_dochanopenchan(void* np, int cargc, char** cargv);
+int qabot_dochanping(void* np, int cargc, char** cargv);
+int qabot_dochanreset(void* np, int cargc, char** cargv);
+int qabot_dochanspam(void* np, int cargc, char** cargv);
+int qabot_dochanstatus(void* np, int cargc, char** cargv);
+int qabot_dochanunblock(void* np, int cargc, char** cargv);
+
+/* qabot_commands.c */
+int qabot_doshowcommands(void* sender, int cargc, char** cargv);
+int qabot_dohelp(void* sender, int cargc, char** cargv);
+int qabot_dohello(void* sender, int cargc, char** cargv);
+int qabot_dosave(void* sender, int cargc, char** cargv);
+int qabot_dolistbots(void* sender, int cargc, char** cargv);
+int qabot_dolistusers(void* sender, int cargc, char** cargv);
+int qabot_doshowbot(void* sender, int cargc, char** cargv);
+int qabot_doaddbot(void* sender, int cargc, char** cargv);
+int qabot_dodelbot(void* sender, int cargc, char** cargv);
+int qabot_doadduser(void* sender, int cargc, char** cargv);
+int qabot_dodeluser(void* sender, int cargc, char** cargv);
+int qabot_dochangelev(void* sender, int cargc, char** cargv);
+int qabot_dowhois(void* sender, int cargc, char** cargv);
+int qabot_dostatus(void* sender, int cargc, char** cargv);
+
+/* qabot_dbase.c */
+void qabot_loaddb();
+void qabot_savedb();
+void qabot_savetimer(void* arg);
+void qabot_adduser(const char* authname, flag_t flags, time_t created);
+void qabot_deluser(const char* authname);
+void qabot_squelchuser(qab_user* user);
+qab_user* qabot_getuser(const char* authname);
+
+/* qabot_help.c */
+int qabot_showhelp(nick* np, char* arg);
+
+#endif