/* * mudinfo.c * * A quick piece of code that allows mudadmins to track the activity of * their mud, and create statistics of that activity. * * Code by Brian Graversen aka Jobo */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include "merc.h" #include "mudinfo.h" int mudinfo[MUDINFO_MAX]; int total_output = 0; void do_mudinfo(CHAR_DATA *ch, char *argument) { char buf[MAX_STRING_LENGTH]; int ratio, a, b, c; if (IS_NPC(ch)) return; sprintf(buf, "Players : Average Online : %d\n\r", (mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS])/mudinfo[MUDINFO_UPDATED]); send_to_char(buf, ch); sprintf(buf, "Players : Peak Online : %d\n\r", mudinfo[MUDINFO_PEAK_USERS]); send_to_char(buf, ch); /* ratio = (100 * mudinfo[MUDINFO_MCCP_USERS] / (mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS])); sprintf(buf, "Players : Mccp Users : %d %%\n\r", ratio); send_to_char(buf, ch); */ /* * a : Amount of kbit data send totally. * b : Amount of kbit data send each 10 seconds * c : The fractional part */ a = mudinfo[MUDINFO_MBYTE] * 1024 + mudinfo[MUDINFO_BYTE] / 1024; b = a / (mudinfo[MUDINFO_UPDATED] * 3); c = b / 10; c = c * 10; c = b - c; sprintf(buf, "Datatransfer : Average Rate : %d.%d kb/sec\n\r", b/10, c); send_to_char(buf, ch); b = mudinfo[MUDINFO_DATA_PEAK] / (3 * 1024); c = b / 10; c = c * 10; c = b - c; sprintf(buf, "Datatransfer : Peak Rate : %d.%d kb/sec\n\r", b/10, c); send_to_char(buf, ch); sprintf(buf, "Datatransfer : This Month : %d MB\n\r", mudinfo[MUDINFO_MBYTE]); send_to_char(buf, ch); sprintf(buf, "Datatransfer : This Boot : %d MB\n\r", mudinfo[MUDINFO_MBYTE_S]); send_to_char(buf, ch); return; } void load_mudinfo() { FILE *fp; int i; if ((fp = fopen("../area/mudinfo.txt", "r")) == NULL) { log_string("Error: mudinfo.txt not found - Creating One!"); for (i = 0; i < MUDINFO_MAX; i++) { mudinfo[i] = 0; } save_mudinfo(); return; } for (i = 0; i < (MUDINFO_MAX - 2); i++) { mudinfo[i] = fread_number(fp); } mudinfo[MUDINFO_MAX - 2] = 0; mudinfo[MUDINFO_MAX - 1] = 0; fclose(fp); } void save_mudinfo() { FILE *fp; int i; if ((fp = fopen("../area/mudinfo.txt","w")) == NULL) { log_string("Error writing to mudinfo.txt"); return; } for (i = 0; i < (MUDINFO_MAX - 2); i++) { fprintf(fp, "%d\n", mudinfo[i]); } fclose(fp); } void write_mudinfo_database() { FILE *fp; int ratio, avusers, a, b, c; if ((fp = fopen("../area/mud_data.txt","a")) == NULL) { log_string("Error writing to mud_data.txt"); return; } /* Calculate the ratio of users that use mccp */ /* ratio = (100 * mudinfo[MUDINFO_MCCP_USERS] / (mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS])); */ /* Calculate the amount of average players online */ avusers = (mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS]) / mudinfo[MUDINFO_UPDATED]; /* Calculate the average tranfer rate in kbyte */ a = mudinfo[MUDINFO_MBYTE] * 1024 + mudinfo[MUDINFO_BYTE] / 1024; b = a / (mudinfo[MUDINFO_UPDATED] * 3); c = b / 10; c = c * 10; c = b - c; /* Append it all to the file */ fprintf(fp, "\nMudinfo Database Entry\n"); fprintf(fp, "Average Online Users %d\n", avusers); // fprintf(fp, "Mccp Ratio %d %%\n", ratio); fprintf(fp, "Amount of MB send %d MB\n", mudinfo[MUDINFO_MBYTE]); fprintf(fp, "Datatransfer Average %d.%d\n", b/10, c); fclose(fp); } void increase_total_output(int clenght) { total_output += clenght; } void update_mudinfo() { DESCRIPTOR_DATA *d; int i, pcount = 0; /* Increase update count */ mudinfo[MUDINFO_UPDATED]++; /* * If it's been roughly one month, then update the database, * and clear out the old information */ if (mudinfo[MUDINFO_UPDATED] > 86500) { write_mudinfo_database(); for (i = 0; i < (MUDINFO_MAX - 2); i++) { mudinfo[i] = 0; } log_string("Mudinfo database updated."); } /* Outdate the output data */ if (total_output > mudinfo[MUDINFO_DATA_PEAK]) mudinfo[MUDINFO_DATA_PEAK] = total_output; /* The stored data */ if (mudinfo[MUDINFO_BYTE] > 1048576) // 1 megabyte { mudinfo[MUDINFO_MBYTE]++; mudinfo[MUDINFO_BYTE] -= 1048576; } mudinfo[MUDINFO_BYTE] += total_output; /* The temp data */ if (mudinfo[MUDINFO_BYTE_S] > 1048576) // 1 megabyte { mudinfo[MUDINFO_MBYTE_S]++; mudinfo[MUDINFO_BYTE_S] -= 1048576; } mudinfo[MUDINFO_BYTE_S] += total_output; /* We clear the counter */ total_output = 0; for (d = descriptor_list; d; d = d->next) { if (d->connected == CON_PLAYING) { if (d->character) { if (d->character->level < 7) { pcount++; /* if (d->out_compress) mudinfo[MUDINFO_MCCP_USERS]++; else */ mudinfo[MUDINFO_OTHER_USERS]++; } } } } if (pcount > mudinfo[MUDINFO_PEAK_USERS]) mudinfo[MUDINFO_PEAK_USERS] = pcount; save_mudinfo(); }