current snap
This commit is contained in:
parent
3cd8871b24
commit
c4e1ad5af7
1
Makefile
1
Makefile
@ -21,6 +21,7 @@ main:
|
|||||||
$(CC) $(CFLAGS) $(SRC)/events.c -o $(OBJ)/events.o
|
$(CC) $(CFLAGS) $(SRC)/events.c -o $(OBJ)/events.o
|
||||||
$(CC) $(CFLAGS) $(SRC)/module.c -o $(OBJ)/module.o
|
$(CC) $(CFLAGS) $(SRC)/module.c -o $(OBJ)/module.o
|
||||||
$(CC) $(CFLAGS) $(SRC)/channel.c -o $(OBJ)/channel.o
|
$(CC) $(CFLAGS) $(SRC)/channel.c -o $(OBJ)/channel.o
|
||||||
|
$(CC) $(CFLAGS) $(SRC)/timers.c -o $(OBJ)/timers.o
|
||||||
$(CC) -o $(EXEC) $(OBJECTS) $(BINFLAGS)
|
$(CC) -o $(EXEC) $(OBJECTS) $(BINFLAGS)
|
||||||
@echo "All Done!"
|
@echo "All Done!"
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#define IRC_END_MOTD "376"
|
#define IRC_END_MOTD "376"
|
||||||
#define IRC_NAMREPLY "353"
|
#define IRC_NAMREPLY "353"
|
||||||
#define IRC_WHOREPLY "352"
|
#define IRC_WHOREPLY "352"
|
||||||
|
#define TICK "TICK"
|
||||||
|
|
||||||
struct ev_handler
|
struct ev_handler
|
||||||
{
|
{
|
||||||
|
56
lib/timers.h
Executable file
56
lib/timers.h
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#ifndef TIMERS_H
|
||||||
|
#define TIMERS_H
|
||||||
|
|
||||||
|
#include "irc.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include <time.h>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windef.h>
|
||||||
|
#else
|
||||||
|
#include <stdbool.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct timer
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
char name[50];
|
||||||
|
int interval;
|
||||||
|
int repeat;
|
||||||
|
int repeat_count;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
BOOL active;
|
||||||
|
#else
|
||||||
|
bool active;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
time_t next_run;
|
||||||
|
struct irc_conn *bot;
|
||||||
|
|
||||||
|
void *handler;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct timers
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
struct timer *timers;
|
||||||
|
};
|
||||||
|
|
||||||
|
void init_timers();
|
||||||
|
|
||||||
|
MY_API int add_timer(struct irc_conn *bot, int interval, int repeat, void *handler, void *data);
|
||||||
|
MY_API void set_timer_name(int id, char *name);
|
||||||
|
MY_API int get_timer_repeat(int id);
|
||||||
|
MY_API void del_timer(int id);
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
MY_API BOOL active_timers();
|
||||||
|
#else
|
||||||
|
MY_API bool active_timers();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void add_to_delete_queue(int id);
|
||||||
|
void fire_timers();
|
||||||
|
|
||||||
|
#endif
|
@ -1,27 +1,61 @@
|
|||||||
#define MY_DLL_EXPORTS 1
|
#define MY_DLL_EXPORTS 1
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
#include "events.h"
|
#include "events.h"
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
|
#include "timers.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
struct said_hi
|
||||||
|
{
|
||||||
|
int timer_id;
|
||||||
|
int repeat;
|
||||||
|
|
||||||
|
char user[50];
|
||||||
|
char host[150];
|
||||||
|
char chan[70];
|
||||||
|
};
|
||||||
|
|
||||||
|
MY_API void said_h(struct irc_conn *bot, void *data)
|
||||||
|
{
|
||||||
|
struct said_hi *hi = (struct said_hi *)data;
|
||||||
|
|
||||||
|
irc_privmsg(bot, hi->chan, "[timer %d] %d : %s", hi->timer_id, get_timer_repeat(hi->timer_id), hi->user);
|
||||||
|
|
||||||
|
if ((get_timer_repeat(hi->timer_id) + 1) > hi->repeat)
|
||||||
|
{
|
||||||
|
free(hi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MY_API void hello(struct irc_conn *bot, char *user, char *host, char *chan, const char *text)
|
MY_API void hello(struct irc_conn *bot, char *user, char *host, char *chan, const char *text)
|
||||||
{
|
{
|
||||||
|
struct said_hi *hi;
|
||||||
|
|
||||||
char *buf = (char *)malloc(sizeof(char *) * 500);
|
char *buf = (char *)malloc(sizeof(char *) * 500);
|
||||||
sprintf(buf, "hi %s", bot->nick);
|
sprintf(buf, "hi %s", bot->nick);
|
||||||
|
|
||||||
if (!strcmp(text, buf))
|
if (!strcmp(text, buf))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, chan, "hi %s", user);
|
hi = calloc(1, sizeof(struct said_hi));
|
||||||
|
|
||||||
printf("%s said hi to me\n", user);
|
irc_privmsg(bot, chan, "hi %s", user);
|
||||||
|
|
||||||
|
sprintf(hi->user, "%s", user);
|
||||||
|
sprintf(hi->host, "%s", host);
|
||||||
|
sprintf(hi->chan, "%s", chan);
|
||||||
|
|
||||||
|
hi->repeat = 3;
|
||||||
|
hi->timer_id = add_timer(bot, 10, hi->repeat, said_h, hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MY_API void hello_join(struct irc_conn *bot, char *user, char *host, char *chan)
|
MY_API void hello_join(struct irc_conn *bot, char *user, char *host, char *chan)
|
||||||
{
|
{
|
||||||
printf("%s!%s joined %s\n", user, host, chan);
|
printf("%s!%s joined %s\n", user, host, chan);
|
||||||
|
@ -13,15 +13,18 @@
|
|||||||
DWORD startTick;
|
DWORD startTick;
|
||||||
|
|
||||||
void parseUptime(const char *output, struct irc_conn *bot, const char *where) {
|
void parseUptime(const char *output, struct irc_conn *bot, const char *where) {
|
||||||
// Variable definitions moved to the top
|
|
||||||
const char *keyword = "Statistics since ";
|
const char *keyword = "Statistics since ";
|
||||||
const char *uptime_start;
|
const char *uptime_start;
|
||||||
int month, day, year, hour, minute;
|
int month, day, year, hour, minute;
|
||||||
SYSTEMTIME uptime_systemtime, current_time;
|
SYSTEMTIME uptime_systemtime, current_time;
|
||||||
ULONGLONG uptime_ticks, current_ticks;
|
ULONGLONG uptime_ticks, current_ticks;
|
||||||
ULONGLONG uptime_seconds;
|
ULONGLONG uptime_seconds;
|
||||||
|
char buf[BUFFER_SIZE];
|
||||||
int days, hours, minutes;
|
int days, hours, minutes;
|
||||||
|
|
||||||
|
OSVERSIONINFOEX osInfo;
|
||||||
|
ZeroMemory(&osInfo, sizeof(OSVERSIONINFOEX));
|
||||||
|
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
||||||
|
|
||||||
uptime_start = strstr(output, keyword);
|
uptime_start = strstr(output, keyword);
|
||||||
if (uptime_start == NULL) {
|
if (uptime_start == NULL) {
|
||||||
@ -58,12 +61,50 @@ void parseUptime(const char *output, struct irc_conn *bot, const char *where) {
|
|||||||
|
|
||||||
uptime_seconds = (current_ticks - uptime_ticks) / 10000000UL; // Convert to seconds
|
uptime_seconds = (current_ticks - uptime_ticks) / 10000000UL; // Convert to seconds
|
||||||
|
|
||||||
uptime_seconds -= 1320;
|
uptime_seconds -= 1470;
|
||||||
|
|
||||||
days = uptime_seconds / (24 * 3600);
|
days = uptime_seconds / (24 * 3600);
|
||||||
hours = (uptime_seconds % (24 * 3600)) / 3600;
|
hours = (uptime_seconds % (24 * 3600)) / 3600;
|
||||||
minutes = (uptime_seconds % 3600) / 60;
|
minutes = (uptime_seconds % 3600) / 60;
|
||||||
irc_privmsg(bot, where, "Uptime: %d days, %d hours, %d minutes\n", days, hours, minutes);
|
|
||||||
|
if (GetVersionEx((OSVERSIONINFO*)&osInfo)) {
|
||||||
|
if (osInfo.dwMajorVersion == 10 && osInfo.dwMinorVersion == 0) {
|
||||||
|
sprintf(buf, "Windows 10");
|
||||||
|
} else if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 3) {
|
||||||
|
sprintf(buf, "Windows 8.1");
|
||||||
|
} else if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 2) {
|
||||||
|
sprintf(buf, "Windows 8");
|
||||||
|
} else if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 1) {
|
||||||
|
// detect Windows 7 or Windows Server 2008 R2
|
||||||
|
if (osInfo.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
sprintf(buf, "Windows 7");
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "Windows Server 2008 R2");
|
||||||
|
}
|
||||||
|
} else if (osInfo.dwMajorVersion == 6 && osInfo.dwMinorVersion == 0) {
|
||||||
|
// detect Windows Vista or Windows Server 2008
|
||||||
|
|
||||||
|
if (osInfo.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
sprintf(buf, "Windows Vista");
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "Windows Server 2008");
|
||||||
|
}
|
||||||
|
} else if (osInfo.dwMajorVersion == 5 && osInfo.dwMinorVersion == 1) {
|
||||||
|
// detect Windows XP or Windows Server 2003
|
||||||
|
|
||||||
|
if (osInfo.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
sprintf(buf, "Windows XP");
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "Windows Server 2003");
|
||||||
|
}
|
||||||
|
} else if (osInfo.dwMajorVersion == 5 && osInfo.dwMinorVersion == 0) {
|
||||||
|
sprintf(buf, "Windows 2000");
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "Windows");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_privmsg(bot, where, "%s: %d days, %d hours, and %d minutes up\n", buf, days, hours, minutes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *executeCommand(const char *command)
|
char *executeCommand(const char *command)
|
||||||
@ -111,8 +152,6 @@ MY_API void up(struct irc_conn *bot, char *user, char *host, char *chan, char *t
|
|||||||
char buf[100];
|
char buf[100];
|
||||||
FILE* file;
|
FILE* file;
|
||||||
|
|
||||||
printf("dbug up called: %s!%s %s\n", user, host, text);
|
|
||||||
|
|
||||||
if (!strcmp(text, "!uptime"))
|
if (!strcmp(text, "!uptime"))
|
||||||
{
|
{
|
||||||
file = popen("uptime", "r");
|
file = popen("uptime", "r");
|
||||||
|
@ -31,6 +31,7 @@ void init_event_type(char *type)
|
|||||||
|
|
||||||
void init_events()
|
void init_events()
|
||||||
{
|
{
|
||||||
|
init_event_type(TICK);
|
||||||
init_event_type(PRIVMSG_SELF);
|
init_event_type(PRIVMSG_SELF);
|
||||||
init_event_type(PRIVMSG_CHAN);
|
init_event_type(PRIVMSG_CHAN);
|
||||||
init_event_type(JOIN);
|
init_event_type(JOIN);
|
||||||
@ -136,7 +137,7 @@ void fire_handler(struct irc_conn *bot, char *type, ...)
|
|||||||
irc_notice(bot, usr, "You are unauthorized to use this command.");
|
irc_notice(bot, usr, "You are unauthorized to use this command.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strcmp("PRINT_HANDLERS", cmd))
|
else if (!strcmp("HANDLERS", cmd))
|
||||||
{
|
{
|
||||||
if (!strcmp(bot->admin, usr))
|
if (!strcmp(bot->admin, usr))
|
||||||
{
|
{
|
||||||
|
21
src/main.c
21
src/main.c
@ -15,6 +15,7 @@
|
|||||||
#include "events.h"
|
#include "events.h"
|
||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
#include "timers.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
@ -32,11 +33,18 @@ int main()
|
|||||||
struct irc_conn bot;
|
struct irc_conn bot;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
|
struct timeval last_ping;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
int bytesRecv;
|
int bytesRecv;
|
||||||
|
|
||||||
|
last_ping.tv_sec = time(NULL);
|
||||||
|
|
||||||
init_events();
|
init_events();
|
||||||
|
init_timers();
|
||||||
init_mods();
|
init_mods();
|
||||||
|
|
||||||
// Read the config
|
// Read the config
|
||||||
@ -50,6 +58,9 @@ int main()
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
fire_timers();
|
||||||
|
fire_handler(&bot, TICK, NULL);
|
||||||
|
|
||||||
FD_ZERO(&rd);
|
FD_ZERO(&rd);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -58,7 +69,7 @@ int main()
|
|||||||
FD_SET(0, &rd);
|
FD_SET(0, &rd);
|
||||||
FD_SET(fileno(bot.srv_fd), &rd);
|
FD_SET(fileno(bot.srv_fd), &rd);
|
||||||
#endif
|
#endif
|
||||||
tv.tv_sec = 120;
|
tv.tv_sec = 1;
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -90,7 +101,12 @@ int main()
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
irc_raw(&bot, "PING %s", bot.host);
|
if (time(NULL) - last_ping.tv_sec >= 120)
|
||||||
|
{
|
||||||
|
last_ping.tv_sec = time(NULL);
|
||||||
|
irc_raw(&bot, "PING %s", bot.host);
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -145,6 +161,7 @@ int main()
|
|||||||
#endif
|
#endif
|
||||||
trespond = time(NULL);
|
trespond = time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
34
src/module.c
34
src/module.c
@ -23,14 +23,17 @@ void init_mods()
|
|||||||
|
|
||||||
void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
||||||
{
|
{
|
||||||
char *error = (char *)malloc(sizeof(char *)*1024);
|
|
||||||
strlcpy(mods->modules[mods->count].fname, file, 256);
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
|
char *error = (char *)malloc(sizeof(char *)*1024);
|
||||||
|
#ifdef _WIN32
|
||||||
|
DWORD err;
|
||||||
|
|
||||||
|
strlcpy(mods->modules[mods->count].fname, file, 256);
|
||||||
mods->modules[mods->count].handle = LoadLibrary(file);
|
mods->modules[mods->count].handle = LoadLibrary(file);
|
||||||
if (mods->modules[mods->count].handle == NULL)
|
if (mods->modules[mods->count].handle == NULL)
|
||||||
{
|
{
|
||||||
sprintf(error, "Error loading %s\n", file);
|
err = GetLastError();
|
||||||
|
sprintf(error, "Error loading %s: %lu", file, err);
|
||||||
|
|
||||||
if (strcmp("runtime", stype))
|
if (strcmp("runtime", stype))
|
||||||
{
|
{
|
||||||
@ -39,7 +42,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -63,7 +66,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -89,7 +92,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -101,7 +104,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
|
|
||||||
if (strcmp("runtime", stype))
|
if (strcmp("runtime", stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, "Module '%s' loaded.", file);
|
irc_notice(bot, where, "Module '%s' loaded.", file);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -111,6 +114,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
#else
|
#else
|
||||||
void (*mod_init)();
|
void (*mod_init)();
|
||||||
|
|
||||||
|
strlcpy(mods->modules[mods->count].fname, file, 256);
|
||||||
mods->modules[mods->count].handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
|
mods->modules[mods->count].handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
|
||||||
if (!mods->modules[mods->count].handle)
|
if (!mods->modules[mods->count].handle)
|
||||||
{
|
{
|
||||||
@ -123,7 +127,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -148,7 +152,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -170,7 +174,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -189,7 +193,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
}
|
}
|
||||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, error);
|
irc_notice(bot, where, error);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -200,7 +204,7 @@ void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
|||||||
|
|
||||||
if (strcmp("runtime", stype))
|
if (strcmp("runtime", stype))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, "Module '%s' loaded.", file);
|
irc_notice(bot, where, "Module '%s' loaded.", file);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -229,7 +233,7 @@ void unload_module(struct irc_conn *bot, char *where, char *file)
|
|||||||
|
|
||||||
if (strcmp(PRIVMSG_CHAN, where))
|
if (strcmp(PRIVMSG_CHAN, where))
|
||||||
{
|
{
|
||||||
irc_privmsg(bot, where, "Module '%s' unloaded.", file);
|
irc_notice(bot, where, "Module '%s' unloaded.", file);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -242,6 +246,8 @@ void unload_module(struct irc_conn *bot, char *where, char *file)
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mods->count--;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
136
src/timers.c
Executable file
136
src/timers.c
Executable file
@ -0,0 +1,136 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "timers.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "irc.h"
|
||||||
|
|
||||||
|
struct timers *timers;;
|
||||||
|
int delete_queue[512];
|
||||||
|
|
||||||
|
void init_timers()
|
||||||
|
{
|
||||||
|
timers = calloc(1, sizeof(struct timers));
|
||||||
|
|
||||||
|
timers->count = 1;
|
||||||
|
timers->timers = calloc(512, sizeof(struct timer));
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API int add_timer(struct irc_conn *bot, int interval, int repeat, void *handler, void *data)
|
||||||
|
{
|
||||||
|
timers->timers[timers->count].interval = interval;
|
||||||
|
timers->timers[timers->count].handler = handler;
|
||||||
|
timers->timers[timers->count].id = timers->count;
|
||||||
|
timers->timers[timers->count].bot = bot;
|
||||||
|
timers->timers[timers->count].repeat = repeat;
|
||||||
|
timers->timers[timers->count].repeat_count = 0;
|
||||||
|
timers->timers[timers->count].data = data;
|
||||||
|
timers->timers[timers->count].active = true;
|
||||||
|
timers->timers[timers->count].next_run = time(NULL) + interval;
|
||||||
|
timers->count++;
|
||||||
|
|
||||||
|
return timers->count - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void set_timer_name(int id, char *name)
|
||||||
|
{
|
||||||
|
sprintf(timers->timers[id].name, "%s", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API int get_timer_repeat(int id)
|
||||||
|
{
|
||||||
|
return timers->timers[id].repeat_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
MY_API BOOL active_timers()
|
||||||
|
#else
|
||||||
|
MY_API bool active_timers()
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < timers->count; i++)
|
||||||
|
{
|
||||||
|
if (timers->timers[i].active)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_to_delete_queue(int id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 512; i++)
|
||||||
|
{
|
||||||
|
if (delete_queue[i] == 0)
|
||||||
|
{
|
||||||
|
delete_queue[i] = id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void del_timer(int id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < timers->count; i++)
|
||||||
|
{
|
||||||
|
if (timers->timers[i].id == id)
|
||||||
|
{
|
||||||
|
while (i < timers->count)
|
||||||
|
{
|
||||||
|
timers->timers[i] = timers->timers[i + 1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
timers->count--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fire_timers()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
void (*handler)();
|
||||||
|
|
||||||
|
for (i = 0; i < timers->count; i++)
|
||||||
|
{
|
||||||
|
if (timers->timers[i].next_run <= time(NULL))
|
||||||
|
{
|
||||||
|
timers->timers[i].next_run = time(NULL) + timers->timers[i].interval;
|
||||||
|
handler = timers->timers[i].handler;
|
||||||
|
|
||||||
|
if (timers->timers[i].active)
|
||||||
|
(*handler)(timers->timers[i].bot, timers->timers[i].data);
|
||||||
|
|
||||||
|
if (timers->timers[i].repeat > 0)
|
||||||
|
{
|
||||||
|
timers->timers[i].repeat_count++;
|
||||||
|
if (timers->timers[i].repeat_count >= timers->timers[i].repeat)
|
||||||
|
{
|
||||||
|
timers->timers[i].active = false;
|
||||||
|
add_to_delete_queue(timers->timers[i].id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (active_timers() == false)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 512; i++)
|
||||||
|
{
|
||||||
|
if (delete_queue[i] != 0)
|
||||||
|
{
|
||||||
|
del_timer(delete_queue[i]);
|
||||||
|
delete_queue[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
6
xbot.sln
6
xbot.sln
@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 11.00
|
|||||||
# Visual Studio 2010
|
# Visual Studio 2010
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xbot", "xbot.vcxproj", "{F9EBC08A-C550-413C-8CC6-81A232859D94}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xbot", "xbot.vcxproj", "{F9EBC08A-C550-413C-8CC6-81A232859D94}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xbot-mods", "xbot-mods\xbot-mods.vcxproj", "{BB6BFF6F-3972-4F0D-86E9-06FF4EAC5C5A}"
|
|
||||||
EndProject
|
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
@ -15,10 +13,6 @@ Global
|
|||||||
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Debug|Win32.Build.0 = Debug|Win32
|
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Release|Win32.ActiveCfg = Release|Win32
|
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Release|Win32.Build.0 = Release|Win32
|
{F9EBC08A-C550-413C-8CC6-81A232859D94}.Release|Win32.Build.0 = Release|Win32
|
||||||
{BB6BFF6F-3972-4F0D-86E9-06FF4EAC5C5A}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{BB6BFF6F-3972-4F0D-86E9-06FF4EAC5C5A}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{BB6BFF6F-3972-4F0D-86E9-06FF4EAC5C5A}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BB6BFF6F-3972-4F0D-86E9-06FF4EAC5C5A}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</LinkIncremental>
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</LinkIncremental>
|
||||||
@ -108,6 +108,7 @@
|
|||||||
<ClInclude Include="lib\events.h" />
|
<ClInclude Include="lib\events.h" />
|
||||||
<ClInclude Include="lib\irc.h" />
|
<ClInclude Include="lib\irc.h" />
|
||||||
<ClInclude Include="lib\module.h" />
|
<ClInclude Include="lib\module.h" />
|
||||||
|
<ClInclude Include="lib\timers.h" />
|
||||||
<ClInclude Include="lib\util.h" />
|
<ClInclude Include="lib\util.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@ -117,6 +118,7 @@
|
|||||||
<ClCompile Include="src\irc.c" />
|
<ClCompile Include="src\irc.c" />
|
||||||
<ClCompile Include="src\main.c" />
|
<ClCompile Include="src\main.c" />
|
||||||
<ClCompile Include="src\module.c" />
|
<ClCompile Include="src\module.c" />
|
||||||
|
<ClCompile Include="src\timers.c" />
|
||||||
<ClCompile Include="src\util.c" />
|
<ClCompile Include="src\util.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
Loading…
Reference in New Issue
Block a user