mirror of
https://github.com/EnergyMech/energymech.git
synced 2025-12-17 23:47:14 +00:00
839 lines
13 KiB
C
839 lines
13 KiB
C
/*
|
|
|
|
EnergyMech, IRC bot software
|
|
Parts Copyright (c) 1997-2018 proton
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
#ifndef STRUCTS_H
|
|
#define STRUCTS_H 1
|
|
|
|
typedef union usercombo
|
|
{
|
|
struct
|
|
{
|
|
uint32_t access:8, /* access level (0-200) [0-255] */
|
|
prot:3, /* protlevel (0-4) [0-7] */
|
|
#ifdef BOTNET
|
|
noshare:1, /* dont share this user over botnet */
|
|
readonly:1, /* botnet cannot alter this user */
|
|
#endif /* BOTNET */
|
|
#ifdef GREET
|
|
greetfile:1, /* greeting is filename */
|
|
randline:1, /* grab random line from filename */
|
|
#endif /* GREET */
|
|
#ifdef BOUNCE
|
|
bounce:1, /* user has access to bouncer */
|
|
#endif /* BOUNCE */
|
|
echo:1, /* partyline echo of own messages */
|
|
aop:1, /* auto-opping */
|
|
avoice:1; /* auto-voicing */
|
|
} x;
|
|
uint32_t comboflags;
|
|
|
|
} usercombo;
|
|
|
|
typedef struct OnMsg
|
|
{
|
|
const char *name;
|
|
void (*func)(char *, const char *, char *, const int);
|
|
uint32_t defaultaccess:8, /* defaultaccess */
|
|
dcc:1,
|
|
cc:1,
|
|
pass:1,
|
|
args:1,
|
|
nopub:1,
|
|
nocmd:1,
|
|
gaxs:1,
|
|
caxs:1,
|
|
redir:1,
|
|
lbuf:1,
|
|
cbang:1,
|
|
acchan:1,
|
|
supres:1; /* -- 21 bits */
|
|
const char *cmdarg;
|
|
|
|
} OnMsg;
|
|
|
|
typedef unsigned char OnMsg_access;
|
|
|
|
#ifndef GENCMD_C
|
|
|
|
typedef struct ircLink
|
|
{
|
|
struct ircLink *next;
|
|
|
|
int servsock;
|
|
int usersock;
|
|
|
|
int status;
|
|
time_t active;
|
|
|
|
char *userLine;
|
|
char *nickLine;
|
|
|
|
char *nick; /* which nick to speak to */
|
|
char *handle;
|
|
|
|
#ifdef IDWRAP
|
|
char *idfile;
|
|
#endif /* IDWRAP */
|
|
|
|
char servmem[MSGLEN];
|
|
char usermem[MSGLEN];
|
|
|
|
} ircLink;
|
|
|
|
typedef struct
|
|
{
|
|
int tenminute;
|
|
int hour;
|
|
|
|
} SequenceTime;
|
|
|
|
typedef struct DEFstruct
|
|
{
|
|
union
|
|
{
|
|
int id;
|
|
void *func;
|
|
|
|
} v;
|
|
char *idstr;
|
|
|
|
} DEFstruct;
|
|
|
|
typedef struct Alias
|
|
{
|
|
struct Alias *next;
|
|
|
|
char *format;
|
|
char alias[1];
|
|
|
|
} Alias;
|
|
|
|
typedef struct nfLog
|
|
{
|
|
struct nfLog *next;
|
|
|
|
time_t signon;
|
|
time_t signoff;
|
|
|
|
char *realname;
|
|
char userhost[2];
|
|
|
|
} nfLog;
|
|
|
|
typedef struct Notify
|
|
{
|
|
struct Notify *next;
|
|
|
|
int status;
|
|
time_t checked; /* when nick was last checked */
|
|
|
|
nfLog *log; /* online + offline + userhost + realname */
|
|
|
|
char *info;
|
|
char *endofmask;
|
|
char *mask;
|
|
char nick[3];
|
|
|
|
} Notify;
|
|
|
|
typedef struct IReq
|
|
{
|
|
struct IReq *next;
|
|
|
|
time_t when;
|
|
int t;
|
|
|
|
char *nick;
|
|
char from[2];
|
|
|
|
} IReq;
|
|
|
|
typedef struct Seen
|
|
{
|
|
struct Seen *next;
|
|
|
|
time_t when;
|
|
int t;
|
|
|
|
/*
|
|
* dont mess with the order of these
|
|
*/
|
|
char *pa;
|
|
char *pb;
|
|
char *userhost;
|
|
char nick[4];
|
|
|
|
} Seen;
|
|
|
|
typedef union UniVar
|
|
{
|
|
union UniVar *proc_var;
|
|
|
|
char *str_var;
|
|
char char_var;
|
|
int int_var;
|
|
|
|
} UniVar;
|
|
|
|
typedef struct Setting
|
|
{
|
|
uchar type;
|
|
uchar uaccess; /* user access to touch/view this setting */
|
|
short min;
|
|
union
|
|
{
|
|
int num;
|
|
int *numptr;
|
|
char chr;
|
|
char *str;
|
|
char **strptr;
|
|
|
|
} v;
|
|
char *name;
|
|
int max;
|
|
void (*func)(const struct Setting *);
|
|
|
|
} Setting;
|
|
|
|
typedef struct Strp
|
|
{
|
|
struct Strp *next;
|
|
char p[1];
|
|
|
|
} Strp;
|
|
|
|
typedef struct KickSay
|
|
{
|
|
struct KickSay *next;
|
|
|
|
int action;
|
|
|
|
/*
|
|
* dont mess with the order of these
|
|
*/
|
|
char *chan;
|
|
char *reason;
|
|
char mask[5];
|
|
|
|
} KickSay;
|
|
|
|
typedef struct Shit
|
|
{
|
|
struct Shit *next;
|
|
|
|
int action;
|
|
time_t time;
|
|
time_t expire;
|
|
|
|
/*
|
|
* dont mess with the order of these
|
|
*/
|
|
char *chan;
|
|
char *from;
|
|
char *reason;
|
|
char mask[4];
|
|
|
|
} Shit;
|
|
|
|
|
|
/*
|
|
* this struct is put to use in global.h
|
|
*/
|
|
typedef struct User
|
|
{
|
|
struct User *next; /* linked list */
|
|
|
|
Strp *mask;
|
|
Strp *chan;
|
|
|
|
union usercombo x;
|
|
|
|
#ifdef GREET
|
|
char *greet;
|
|
#endif /* GREET */
|
|
|
|
#ifdef NOTE
|
|
Strp *note;
|
|
#endif /* NOTE */
|
|
|
|
#ifdef BOTNET
|
|
int modcount;
|
|
uint16_t guid;
|
|
int tick;
|
|
int addsession;
|
|
#endif /* BOTNET */
|
|
|
|
/*
|
|
* dont mess with the order of these
|
|
*/
|
|
char *pass;
|
|
char name[2];
|
|
|
|
} User;
|
|
|
|
typedef struct Client
|
|
{
|
|
struct Client *next;
|
|
|
|
User *user;
|
|
|
|
int sock;
|
|
int flags;
|
|
int inputcount; /* used to enforce input limit */
|
|
time_t lasttime; /* can be used for idletime */
|
|
|
|
#ifdef DCC_FILE
|
|
int fileno;
|
|
int fileend;
|
|
time_t start;
|
|
char *whom;
|
|
char filename[2];
|
|
#endif /* DCC_FILE */
|
|
|
|
char sockdata[MSGLEN]; /* input buffer */
|
|
|
|
} Client;
|
|
|
|
typedef struct ShortClient
|
|
{
|
|
struct Client *next;
|
|
|
|
User *user;
|
|
|
|
int sock;
|
|
int flags;
|
|
int inputcount; /* used to enforce input limit */
|
|
time_t lasttime; /* can be used for idletime */
|
|
|
|
} ShortClient;
|
|
|
|
typedef struct Auth
|
|
{
|
|
struct Auth *next;
|
|
|
|
time_t active;
|
|
User *user;
|
|
char nuh[1];
|
|
|
|
} Auth;
|
|
|
|
typedef struct ChanUser
|
|
{
|
|
struct ChanUser *next;
|
|
|
|
User *user;
|
|
Shit *shit;
|
|
|
|
int flags;
|
|
|
|
uint8_t action_num[INDEX_MAX];
|
|
time_t action_time[INDEX_MAX];
|
|
time_t idletime;
|
|
|
|
#ifdef CHANBAN
|
|
time_t lastwhois; /* time when the last whois was made to check channels */
|
|
#endif /* CHANBAN */
|
|
|
|
char *nick; /* nick can change without the user reconnecting */
|
|
char userhost[1]; /* ident & host is static */
|
|
|
|
} ChanUser;
|
|
|
|
typedef struct qKick
|
|
{
|
|
struct qKick *next;
|
|
|
|
char *reason;
|
|
char nick[2];
|
|
|
|
} qKick;
|
|
|
|
typedef struct qMode
|
|
{
|
|
struct qMode *next;
|
|
|
|
int pri; /* urgency factor */
|
|
int type;
|
|
|
|
void *data; /* nick (ChanUser), key, banmask, limit */
|
|
char plusminus; /* +/- */
|
|
char modeflag; /* ov, iklmnpst */
|
|
|
|
} qMode;
|
|
|
|
typedef struct Ban
|
|
{
|
|
struct Ban *next;
|
|
|
|
time_t time;
|
|
#ifdef IRCD_EXTENSIONS
|
|
uint32_t imode:1,
|
|
emode:1;
|
|
#endif /* IRCD_EXTENSIONS */
|
|
|
|
char *bannedby;
|
|
char banstring[2];
|
|
|
|
} Ban;
|
|
|
|
typedef struct ChanStats
|
|
{
|
|
int userseconds; /* number of users on channel * number of seconds (one hour, 3600 seconds) */
|
|
int LHuserseconds;
|
|
int users;
|
|
time_t lastuser; /* last time a user joined or left (part, quit, kick) */
|
|
|
|
int flags;
|
|
|
|
int userpeak;
|
|
int userlow;
|
|
|
|
int joins;
|
|
int parts;
|
|
int kicks;
|
|
int quits;
|
|
|
|
int privmsg;
|
|
int notice;
|
|
|
|
} ChanStats;
|
|
|
|
typedef struct ShortChan
|
|
{
|
|
struct ShortChan *next;
|
|
const char *name;
|
|
|
|
} ShortChan;
|
|
|
|
typedef struct Chan
|
|
{
|
|
struct Chan *next;
|
|
|
|
char *name; /* name of the channel */
|
|
char *key; /* channel key, if any */
|
|
char *topic; /* channel topic, if any */
|
|
char *kickedby; /* n!u@h of whomever kicks the bot */
|
|
|
|
Ban *banlist; /* banlist */
|
|
qKick *kicklist; /* KICK sendq */
|
|
qMode *modelist; /* MODE sendq */
|
|
|
|
ChanUser *users; /* users */
|
|
ChanUser *cacheuser; /* cache for find_chanuser() */
|
|
|
|
int limit; /* channel limit */
|
|
|
|
uint32_t bot_is_op:1, /* set if the bot is opped */
|
|
private:1, /* channel mode: +p */
|
|
secret:1, /* channel mode: +s */
|
|
moderated:1, /* channel mode: +m */
|
|
topprot:1, /* channel mode: +t */
|
|
limitmode:1, /* channel mode: +l */
|
|
invite:1, /* channel mode: +i */
|
|
nomsg:1, /* channel mode: +n */
|
|
keymode:1, /* channel mode: +k */
|
|
hiddenkey:1, /* Undernet screwup */
|
|
sync:1, /* join sync status */
|
|
wholist:1, /* first /WHO */
|
|
active:1, /* active or inactive channel */
|
|
rejoin:1; /* trying to rejoin it? */
|
|
|
|
int this10,this60;
|
|
int last10,last60;
|
|
|
|
#ifdef DYNAMODE
|
|
time_t lastlimit;
|
|
#endif /* DYNAMODE */
|
|
|
|
#ifdef STATS
|
|
ChanStats *stats;
|
|
#endif /* STATS */
|
|
|
|
UniVar setting[CHANSET_SIZE]; /* channel vars */
|
|
|
|
} Chan;
|
|
|
|
typedef struct Spy
|
|
{
|
|
struct Spy *next;
|
|
|
|
int t_src;
|
|
int t_dest;
|
|
|
|
Client *dcc;
|
|
int destbot;
|
|
|
|
const char *src;
|
|
char *dest;
|
|
char p[2];
|
|
|
|
} Spy;
|
|
|
|
typedef struct Server
|
|
{
|
|
struct Server *next;
|
|
|
|
int ident;
|
|
int usenum;
|
|
int servergroup;
|
|
int port;
|
|
int err;
|
|
time_t lastconnect;
|
|
time_t lastattempt;
|
|
time_t maxontime;
|
|
|
|
char realname[NAMEBUF];
|
|
char name[NAMEBUF];
|
|
char pass[PASSLEN];
|
|
|
|
} Server;
|
|
|
|
typedef struct ServerGroup
|
|
{
|
|
struct ServerGroup *next;
|
|
|
|
int servergroup;
|
|
char name[1];
|
|
|
|
} ServerGroup;
|
|
|
|
typedef struct Mech
|
|
{
|
|
struct Mech *next;
|
|
|
|
uint16_t guid; /* globally uniqe ID */
|
|
int connect;
|
|
int sock;
|
|
struct in_addr ip; /* for DCC */
|
|
int server; /* ident of my current server */
|
|
int nextserver;
|
|
|
|
#ifdef BOTNET
|
|
const char *supres_cmd;
|
|
int supres_crc;
|
|
#endif
|
|
|
|
/*
|
|
* Line buffer for non-essential stuff
|
|
*/
|
|
Strp *sendq;
|
|
time_t sendq_time;
|
|
|
|
/*
|
|
* Basic bot information
|
|
*/
|
|
char *nick; /* current nickname */
|
|
char *wantnick; /* wanted nickname */
|
|
char *userhost;
|
|
int vhost_type;
|
|
|
|
uint32_t reset:1,
|
|
rejoin:1,
|
|
away:1;
|
|
|
|
User *userlist;
|
|
time_t ul_save; /* increment for each change, save if needed */
|
|
|
|
Chan *chanlist;
|
|
Chan *activechan;
|
|
|
|
Client *clientlist;
|
|
Auth *authlist;
|
|
Shit *shitlist;
|
|
KickSay *kicklist;
|
|
IReq *parselist;
|
|
|
|
#ifdef NOTIFY
|
|
Notify *notifylist;
|
|
#endif /* NOTIFY */
|
|
|
|
Spy *spylist;
|
|
int spy;
|
|
|
|
#ifdef NOTIFY
|
|
time_t lastnotify; /* ... */
|
|
#endif /* NOTIFY */
|
|
time_t lastreset; /* last time bot was reset */
|
|
time_t lastantiidle; /* avoid showing large idle times */
|
|
time_t lastrejoin; /* last time channels were reset */
|
|
#ifdef CHANBAN
|
|
time_t lastchanban; /* last time a chanban check was run */
|
|
#endif /* CHANBAN */
|
|
|
|
time_t conntry; /* when connect try started */
|
|
time_t activity; /* Away timer (AAWAY) */
|
|
|
|
time_t ontime; /* how long the bot has been connected */
|
|
|
|
#ifdef IRCD_EXTENSIONS
|
|
int ircx_flags;
|
|
#endif /* IRCD_EXTENSIONS */
|
|
|
|
/*
|
|
* Buffers for do_die() command.
|
|
*/
|
|
char *signoff;
|
|
char *from;
|
|
|
|
#ifdef IDWRAP
|
|
char *identfile;
|
|
#endif /* IDWRAP */
|
|
|
|
/* big buffers at the end */
|
|
UniVar setting[SIZE_VARS]; /* global vars + channel defaults */
|
|
char modes[32];
|
|
char *lastcmds[LASTCMDSIZE];
|
|
|
|
/*
|
|
* Server socket input buffer
|
|
*/
|
|
char sockdata[MSGLEN];
|
|
|
|
} Mech;
|
|
|
|
typedef struct aME
|
|
{
|
|
void *area;
|
|
void *doer;
|
|
int size;
|
|
time_t when;
|
|
char touch;
|
|
|
|
} aME;
|
|
|
|
typedef struct aMEA
|
|
{
|
|
struct aMEA *next;
|
|
aME mme[MRSIZE];
|
|
|
|
} aMEA;
|
|
|
|
typedef struct KillSock
|
|
{
|
|
struct KillSock *next;
|
|
time_t time;
|
|
int sock;
|
|
|
|
} KillSock;
|
|
|
|
typedef struct Note
|
|
{
|
|
struct Note *next;
|
|
|
|
time_t start;
|
|
|
|
char *user;
|
|
char *to;
|
|
char from[3];
|
|
|
|
} Note;
|
|
|
|
typedef struct PartyUser
|
|
{
|
|
struct PartyUser *next;
|
|
|
|
} PartyUser;
|
|
|
|
typedef struct BotInfo
|
|
{
|
|
struct BotInfo *next;
|
|
|
|
uint16_t guid;
|
|
int hops;
|
|
|
|
char *version;
|
|
char *server;
|
|
char nuh[4];
|
|
|
|
} BotInfo;
|
|
|
|
typedef struct BotNet
|
|
{
|
|
struct BotNet *next;
|
|
|
|
int sock;
|
|
int status;
|
|
int has_data;
|
|
|
|
/*
|
|
* do not touch the above vars!
|
|
* they are copied partially in that order in net.c
|
|
*/
|
|
|
|
uint16_t guid; /* remote bot guid */
|
|
int lsid; /* local session id */
|
|
int rsid; /* remote session id */
|
|
|
|
struct
|
|
{
|
|
uint32_t pta:1, /* plain text auth */
|
|
sha:1, /* SHA */
|
|
md5:1; /* MD5 */
|
|
|
|
} opt;
|
|
|
|
Mech *controller;
|
|
|
|
int tick; /* tick of the remote bot */
|
|
int addsession;
|
|
time_t tick_last;
|
|
|
|
time_t when;
|
|
|
|
struct BotInfo *botinfo;
|
|
int list_complete;
|
|
|
|
char sockdata[MSGLEN];
|
|
|
|
} BotNet;
|
|
|
|
typedef struct NetCfg
|
|
{
|
|
struct NetCfg *next;
|
|
|
|
uint16_t guid;
|
|
uint16_t port;
|
|
uint16_t linked; /*:1;*/
|
|
|
|
char *host;
|
|
char pass[2];
|
|
|
|
} NetCfg;
|
|
|
|
typedef struct WebDoc
|
|
{
|
|
struct WebDoc *next;
|
|
|
|
char *url;
|
|
void (*proc)();
|
|
|
|
} WebDoc;
|
|
|
|
typedef struct WebSock
|
|
{
|
|
struct WebSock *next;
|
|
|
|
int sock;
|
|
int status;
|
|
time_t when;
|
|
|
|
WebDoc *docptr;
|
|
Mech *ebot;
|
|
Chan *echan;
|
|
char *url;
|
|
|
|
char sockdata[MSGLEN];
|
|
|
|
} WebSock;
|
|
|
|
typedef struct
|
|
{
|
|
time_t last;
|
|
time_t next;
|
|
uint32_t second1; /*:30;*/
|
|
uint32_t second2; /*:30;*/
|
|
uint32_t minute1; /*:30;*/
|
|
uint32_t minute2; /*:30;*/
|
|
uint32_t hour; /*:24;*/
|
|
uint32_t weekday; /*:7;*/
|
|
|
|
} HookTimer;
|
|
|
|
typedef struct Hook
|
|
{
|
|
struct Hook *next;
|
|
|
|
int (*func)();
|
|
uint16_t guid; /* guid filter */
|
|
int flags;
|
|
union {
|
|
void *any;
|
|
char *command;
|
|
char *host;
|
|
HookTimer *timer;
|
|
} type;
|
|
char self[2];
|
|
|
|
} Hook;
|
|
|
|
typedef struct TrivScore
|
|
{
|
|
struct TrivScore *next;
|
|
|
|
int score_wk;
|
|
int score_last_wk;
|
|
int week_nr;
|
|
|
|
int score_mo;
|
|
int score_last_mo;
|
|
int month_nr;
|
|
|
|
char nick[1];
|
|
|
|
} TrivScore;
|
|
|
|
typedef struct dnsAuthority
|
|
{
|
|
struct dnsAuthority *next;
|
|
struct in_addr ip;
|
|
unsigned char count;
|
|
char hostname[1];
|
|
|
|
} dnsAuthority;
|
|
|
|
typedef struct dnsList
|
|
{
|
|
struct dnsList *next;
|
|
time_t when;
|
|
struct in_addr ip;
|
|
uint16_t id;
|
|
int findauth;
|
|
dnsAuthority *auth;
|
|
dnsAuthority *auth2;
|
|
char *cname;
|
|
char host[1];
|
|
|
|
} dnsList;
|
|
|
|
typedef struct dnsQuery
|
|
{
|
|
uint16_t qid; /* query id */
|
|
uint16_t flags;
|
|
uint16_t questions;
|
|
uint16_t answers;
|
|
uint16_t authorities;
|
|
uint16_t resources;
|
|
|
|
} dnsQuery;
|
|
|
|
typedef struct BigC
|
|
{
|
|
struct BigC *next;
|
|
|
|
int width;
|
|
Strp *data;
|
|
char chars[1];
|
|
|
|
} BigC;
|
|
|
|
#endif /* ifndef GENCMD_C */
|
|
|
|
#endif /* STRUCTS_H */
|