---------------------------
= 47
*/
- chanList = calloc(47, sizeof(*chanList));
+ #define CHANNEL_LIST_SIZE 47
+ chanList = calloc(CHANNEL_LIST_SIZE, sizeof(*chanList));
unsigned int *mode, flag = 1;
modes_with_strarg = 0;
modes_with_intarg = 0;
int i;
struct ChanNode *chan, *next;
struct ChanUser *chanuser, *next_chanuser;
- for(i = 0; i < 47; i++) {
+ for(i = 0; i < CHANNEL_LIST_SIZE; i++) {
for(chan = chanList[i]; chan; chan = next) {
next = chan->next;
for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) {
return chan;
}
+int getChannelCount() {
+ int i, count = 0;
+ struct ChanNode *chan;
+ for(i = 0; i < CHANNEL_LIST_SIZE; i++) {
+ for(chan = chanList[i]; chan; chan = chan->next) {
+ count++;
+ }
+ }
+ return count;
+}
+
+int getChanUserCount() {
+ int i, count = 0;
+ struct ChanNode *chan;
+ for(i = 0; i < CHANNEL_LIST_SIZE; i++) {
+ for(chan = chanList[i]; chan; chan = chan->next) {
+ count += chan->usercount;
+ }
+ }
+ return count;
+}
+
void delChannel(struct ChanNode* chan, int freeChan) {
int chanListIndex = get_chanlist_entry(chan->name[1]);
if(chanListIndex == -1) return;
int is_valid_chan(const char *name);
struct ChanNode* getChanByName(const char *name);
struct ChanNode* addChannel(const char *chan);
+int getChannelCount();
+int getChanUserCount();
void delChannel(struct ChanNode* chan, int freeChan);
void freeChanNode(struct ChanNode* chan);
void checkChannelVisibility(struct ChanNode* chan);
client->user = user;
client->flags = 0;
client->bufferpos = 0;
+ client->traffic_in = 0;
+ client->traffic_out = 0;
+ client->connection_time = 0;
client->botid = 0;
client->clientid = 0;
client->next = sockets->data;
client->sock = sock;
client->flags |= SOCKET_FLAG_CONNECTED;
+ client->connection_time = time(0);
//send the IRC Headers
char sendBuf[512];
if(!(client->flags & SOCKET_FLAG_CONNECTED)) return 0;
printf("[send %d] %s", len, msg);
write(client->sock, msg, len);
+ client->traffic_out += len;
return 1;
}
sock->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY);
bot_disconnect(sock);
} else {
+ sock->traffic_in += bytes;
int used = parse_lines(sock, sock->buffer, sock->bufferpos);
if(used == sock->bufferpos + 1) {
//used all bytes so just reset the bufferpos
struct ClientSocket *sock = (last_bot ? last_bot->next : sockets->data);
if(sock == NULL) return NULL;
for (; sock; sock = sock->next) {
- if((sock->flags & flags) == flags)
+ if(!flags || (sock->flags & flags) == flags)
return sock;
}
return NULL;
int port;
char *pass;
struct UserNode *user;
+ unsigned long traffic_in;
+ unsigned long traffic_out;
+ time_t connection_time;
int botid : 16;
int clientid : 16;
return last->next;
}
+int getUserCount() {
+ int i, count = 0;
+ struct UserNode *user;
+ for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) {
+ for(user = userList[i]; user; user = user->next) {
+ count++;
+ }
+ }
+ return count;
+}
+
struct UserNode* addUser(const char *nick) {
int userListIndex = get_nicklist_entry(*nick);
if(userListIndex == -1 || !is_valid_nick(nick))
char *getAuthFakehost(char *auth);
struct UserNode* searchUserByNick(const char *nick);
struct UserNode* getAllUsers(struct UserNode *last);
+int getUserCount();
struct UserNode* addUser(const char *nick);
struct UserNode* addUserMask(const char *mask);
struct UserNode* createTempUser(const char *mask);
{"NS_DELBAN_BANNED_BY", "%s is banned by %s."},
{"NS_DELBAN_FAIL", "Sorry, no ban found for \002%s\002."},
{"NS_DELBAN_DONE", "Removed \002%s\002 from the %s ban list."},
+ {"NS_NETINFO_HEADER", "\002Network information\002"},
+ {"NS_NETINFO_UPTIME", "Uptime:"},
+ {"NS_NETINFO_TRAFFIC", "Traffic:"},
+ {"NS_NETINFO_CACHE", "Cache:"},
+ {"NS_NETINFO_CHANNEL", " Channel:"},
+ {"NS_NETINFO_USER", " User:"},
+ {"NS_NETINFO_CHANUSER", " Channel-User:"},
{NULL, NULL}
};
//#include "cmd_neonserv_mode.c"
//#include "cmd_neonserv_invite.c"
//#include "cmd_neonserv_info.c"
-//#include "cmd_neonserv_netinfo.c"
+#include "cmd_neonserv_netinfo.c"
//#include "cmd_neonserv_peek.c"
#include "cmd_neonserv_set.c" /* TODO: parse, check and set modelock */
//#include "cmd_neonserv_events.c"
register_command(BOTID, "addban", neonserv_cmd_addban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_staticban", 0);
register_command(BOTID, "bans", neonserv_cmd_bans, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "1", 0);
register_command(BOTID, "delban", neonserv_cmd_delban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_staticban", 0);
+ register_command(BOTID, "netinfo", neonserv_cmd_netinfo, 0, 0, NULL, 0);
register_command(BOTID, "trace", neonserv_cmd_trace, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, NULL, 400);
register_default_language_table(msgtab);
}
+void loop_NeonServ() {
+ //check channel bans
+ check_mysql();
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ printf_mysql_query("SELECT `ban_mask`, `ban_id` FROM `bans` WHERE `ban_expire` != '0' AND `ban_expire` <= UNIX_TIMESTAMP()");
+ res = mysql_use();
+ while ((row = mysql_fetch_row(res)) != NULL) {
+ printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", row[1]);
+ //TODO: remove the ban from the channel
+ }
+ mysql_free();
+}
+
void free_NeonServ() {
}
#include "main.h"
void init_NeonServ();
+void loop_NeonServ();
void free_NeonServ();
#endif
\ No newline at end of file
init_NeonServ();
}
+void loop_bots() {
+ loop_NeonServ();
+}
+
void free_bots() {
free_NeonServ();
}
#include "main.h"
void init_bots();
+void loop_bots();
void free_bots();
#endif
\ No newline at end of file
--- /dev/null
+
+/*
+* no args
+*/
+static CMD_BIND(neonserv_cmd_netinfo) {
+ reply(getTextBot(), user, "NS_NETINFO_HEADER");
+ char tmp[MAXLEN];
+ struct Table *table;
+ table = table_init(2, 5, 0);
+ char *content[2];
+
+ content[0] = get_language_string(user, "NS_NETINFO_UPTIME");
+ content[1] = timeToStr(user, (time(0) - start_time), 3, tmp);
+ table_add(table, content);
+
+ content[0] = get_language_string(user, "NS_NETINFO_BOTS");
+ struct ClientSocket *cclient;
+ int bot_count = 0, connected_bot_count = 0;
+ unsigned long traffic_in = 0, traffic_out = 0;
+ for(cclient = getBots(0, NULL); cclient; cclient = getBots(0, cclient)) {
+ bot_count++;
+ if(cclient->flags & SOCKET_FLAG_READY)
+ connected_bot_count++;
+ traffic_in += cclient->traffic_in;
+ traffic_out += cclient->traffic_out;
+ }
+ sprintf(tmp, "%d (%d connected)", bot_count, connected_bot_count);
+ content[1] = tmp;
+ table_add(table, content);
+
+ content[0] = get_language_string(user, "NS_NETINFO_TRAFFIC");
+ sprintf(tmp, "in: %lu kb out: %lu kb", traffic_in / 1024, traffic_out / 1024);
+ content[1] = tmp;
+ table_add(table, content);
+
+ int channel_count = getChannelCount();
+ float channel_memory = channel_count * sizeof(struct ChanNode);
+ int user_count = getUserCount();
+ float user_memory = user_count * sizeof(struct UserNode);
+ int chanuser_count = getChanUserCount();
+ float chanuser_memory = chanuser_count * sizeof(struct ChanUser);
+ float total_memory = channel_memory + user_memory + chanuser_memory;
+
+ content[0] = get_language_string(user, "NS_NETINFO_CACHE");
+ sprintf(tmp, "%f kB (%f MB)", total_memory / 1024, total_memory / 1024 / 1024);
+ content[1] = tmp;
+ table_add(table, content);
+
+ content[0] = get_language_string(user, "NS_NETINFO_CHANNEL");
+ sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", channel_count, channel_memory / 1024, channel_count, sizeof(struct ChanNode), channel_memory / 1024);
+ content[1] = tmp;
+ table_add(table, content);
+
+ content[0] = get_language_string(user, "NS_NETINFO_USER");
+ sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", user_count, user_memory / 1024, user_count, sizeof(struct UserNode), user_memory / 1024);
+ content[1] = tmp;
+ table_add(table, content);
+
+ content[0] = get_language_string(user, "NS_NETINFO_CHANUSER");
+ sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", chanuser_count, chanuser_memory / 1024, chanuser_count, sizeof(struct ChanUser), chanuser_memory / 1024);
+ content[1] = tmp;
+ table_add(table, content);
+
+ char **table_lines = table_end(table);
+ int i;
+ for(i = 0; i < table->entrys; i++) {
+ reply(getTextBot(), user, table_lines[i]);
+ }
+ table_free(table);
+}
#include "tools.h"
#include "timeq.h"
+time_t start_time;
+
void cleanup() {
free_sockets();
free_parser();
int main(void)
{
+ start_time = time(0);
+
init_mysql();
init_lang();
init_parser();
socket_loop(SOCKET_SELECT_TIME);
} while(time(0) < socket_wait);
timeq_tick();
+ loop_bots();
clearTempUsers();
}
}
#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN
+extern time_t start_time;
+
int stricmp (const char *s1, const char *s2);
int stricmplen (const char *s1, const char *s2, int len);