/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/*
* who_html.c
*
* This piece of code allows the mud to create a html file, that looks
* a bit like the 'who screen'. By calling this function every few ticks,
* the mud can keep an updated listing which can be accessed from the web.
*
* 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 "merc.h"
#define HTML_DIR "../../public_html/"
char * plr_class_name(int arg)
{
static char buf[512];
buf[0] = '\0';
switch(arg)
{
case CLASS_DEMON:
strcat(buf, " <font color=\"#FF0000\">[</font><font color=\"#666666\">Demon</font><font color=\"#FF0000\">]</font>");
break;
case CLASS_MAGE:
strcat(buf, " <font color=\"#666666\">{{</font><font color=\"#33CCFF\">Battlemage</font><font color=\"#666666\">}}</font>");
break;
case CLASS_WEREWOLF:
strcat(buf, " <font color=\"#FFFF00\">((</font><font color=\"#3333FF\">Werewolf</font><font color=\"#FFFF00\">))</font>");
break;
case CLASS_VAMPIRE:
strcat(buf, " <font color=\"#666666\"><<</font><font color=\"#FF0000\">Vampire</font><font color=\"#666666\">>></font>");
break;
case CLASS_SAMURAI:
strcat(buf, " <font color=\"#33CCFF\">-=</font><font color=\"#FF0000\">Samu</font><font color=\"#FFFF00\">rai</font><font color=\"#33CCFF\">=-</font>");
break;
case CLASS_DROW:
strcat(buf, " <font color=\"#CC33CC\">.o0</font><font color=\"#666666\">Drow</font><font color=\"#CC33CC\">0o.</font>");
break;
case CLASS_MONK:
strcat(buf, " <font color=\"#666666\">.x[</font><font color=\"#3333FF\">Monk</font><font color=\"#666666\">]x.</font>");
break;
case CLASS_NINJA:
strcat(buf, " <font color=\"#33CCFF\">***</font><font color=\"#FFFF00\">Ninja</font><font color=\"#33CCFF\">***</font>");
break;
case CLASS_LICH:
strcat(buf, " <font color=\"#33FF33\">>*<</font><font color=\"#FFFFFF\">Lich</font><font color=\"#33FF33\">>*<</font>");
break;
case CLASS_SHAPESHIFTER:
strcat(buf, " <font color=\"#666666\">[</font><font color=\"#CC33CC\">*</font><font color=\"#666666\">]</font><font color=\"#FF0000\">Shapeshifter</font><font color=\"#666666\">[</font><font color=\"#CC33CC\">*</font><font color=\"#666666\">]</font>");
break;
case CLASS_TANARRI:
strcat(buf, " <font color=\"#FFFF00\">{</font><font color=\"#FF0000\">Tanar'ri</font><font color=\"#FFFF00\">}</font>");
break;
case CLASS_ANGEL:
strcat(buf, " <font color=\"#FFFF00\">.x</font><font color=\"#666666\">(</font><font color=\"#FFFFFF\">Angel</font><font color=\"#666666\">)</font><font color=\"#FFFF00\">x.</font>");
break;
case CLASS_UNDEAD_KNIGHT:
strcat(buf, " <font color=\"#666666\">|[</font><font color=\"#3366FF\">Undead Knight</font><font color=\"#666666\">]|</font>");
break;
case CLASS_DROID:
strcat(buf, " <font color=\"#CC33CC\">{</font><font color=\"#666666\">-</font><font color=\"#CC33CC\">}</font><font color=\"#666666\">Spider Droid</font><font color=\"#CC33CC\">{</font><font color=\"#666666\">-</font><font color=\"#CC33CC\">}</font><font color=\"#FFFFFF\"></font>");
break;
case CLASS_FAE:
strcat(buf, " <font color=\"#33FF33\"><<</font><font color=\"#FF0000\">(</font><font color=\"#FFFF00\">Fae</font><font color=\"#FF0000\">)</font><font color=\"#33FF33\">>></font>");
break;
case CLASS_DRONE:
strcat(buf, " <font color=\"#33FF33\"><</font><font color=\"#666666\">=</font><font color=\"#FFFF00\">{</font><font color=\"#666666\">Drone</font><font color=\"#FFFF00\">}</font><font color=\"#666666\">=</font><font color=\"#33FF33\">></font>");
break;
case CLASS_GIANT:
strcat(buf, " <font color=\"#33CCFF\"><></font><font color=\"#33FF33\">Giant</font><font color=\"#33CCFF\"><></font>");
break;
case CLASS_HOBBIT:
strcat(buf, " <font color=\"#FFCC00\">(</font><font color=\"#66FFFF\">*</font><font color=\"#FFCC00\">)</font><font color=\"#FF0000\">Hobbit</font><font color=\"#FFCC00\">(</font><font color=\"#66FFFF\">*</font><font color=\"#FFCC00\">)</font>");
break;
}
return (buf[0] != '\0') ? buf+1 : "none";
}
char * plr_kingdom_name(int arg)
{
static char buf[512];
buf[0] = '\0';
switch(arg)
{
case 1:
strcat(buf, " <font color=\"#33FF33\">=</font><font color=\"#999999\">Loa</font><font color=\"#33FF33\">=</font>");
break;
case 2:
strcat(buf, " <font color=\"#3333FF\">-</font><font color=\"#FFFF00\">X</font><font color=\"#3333FF\">-S</font><font color=\"#999999\">tars</font><font color=\"#3333FF\">-</font><font color=\"#FFFF00\">X</font><font color=\"#3333FF\">-</font>");
break;
case 3:
strcat(buf, " <font color=\"#66FFFF\">::</font><font color=\"#FFCC00\">T</font><font color=\"#FFFF00\">he </font><font color=\"#FFCC00\">O</font><font color=\"#FFFF00\">ne </font><font color=\"#FFCC00\">T</font><font color=\"#FFFF00\">rue</font><font color=\"#66FFFF\">::</font>");
break;
case 4:
strcat(buf, " <font color=\"#33FF33\">=</font><font color=\"#FFFF00\">*</font><font color=\"#33FF33\">=</font><font color=\"#999999\">W</font><font color=\"#33FF33\">ild=</font><font color=\"#FFFF00\">*</font><font color=\"#33FF33\">=</font>");
break;
case 5:
strcat(buf, " <font color=\"#FF0000\">/></font><font color=\"#FFFFFF\">G</font><font color=\"#999999\">ahr</font><font color=\"#FF0000\"><\\</font>");
break;
}
return (buf[0] != '\0') ? buf+1 : " ";
}
void parse_who()
{
CHAR_DATA *ch;
DESCRIPTOR_DATA *d;
FILE *fp;
char whofile[200];
char buf[MAX_STRING_LENGTH];
char fadein_data[MAX_STRING_LENGTH];
char fadeout_data[MAX_STRING_LENGTH];
char body_data[4 * MAX_STRING_LENGTH]; // should be enough
int pcount = 0, pcountv = 0;
sprintf(whofile, "%s%s", HTML_DIR, "who.html");
if ((fp = fopen(whofile, "w")) == NULL)
{
log_string("Error writing to who.html");
return;
}
/*
* Now let's fill out the body of the file.
*/
sprintf(body_data, "\n");
for (d = descriptor_list; d; d = d->next)
{
if (d->connected != CON_PLAYING) continue;
if ((ch = d->character) == NULL) continue;
if (ch->level > 6) continue; // we don't list the immortals.
pcount++;
if (IS_SET(ch->act, PLR_WIZINVIS) || IS_SET(ch->act, AFF_HIDE) || IS_SET(ch->newbits, NEW_DARKNESS)) continue;
pcountv++;
strcat(body_data, "<tr>\n");
sprintf(buf, "<td>%s</td>\n", ch->name);
strcat(body_data, buf);
sprintf(buf, "<td>%s</td>\n", plr_class_name(ch->class));
strcat(body_data, buf);
sprintf(buf, "<td>%s</td>\n", plr_kingdom_name(ch->pcdata->religion));
strcat(body_data, buf);
strcat(body_data, "</tr>\n");
}
/*
* Setting up the header and foot of the file
*/
sprintf(fadein_data, "<html>\n");
strcat(fadein_data, "<body text=\"#FFFFFF\" bgcolor=\"#FFFFFF\" link=\"#000000\" vlink=\"#000000\" alink=\"#0055FF\">\n");
strcat(fadein_data, "<table><br>\n");
strcat(fadein_data, "<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor=\"#000000\"><tr><td>\n");
strcat(fadein_data, "<table width=100% border=0 cellspacing=1 cellpadding=3><tr><td colspan=1 bgcolor=\"#999999\">\n");
strcat(fadein_data, "<font size=4><center><b><font color=\"#000000\">Players Online</font></b></center></td></tr>\n");
strcat(fadein_data, "<tr><td bgcolor=\"#000000\"><font size=3>\n");
strcat(fadein_data, "<p><table WIDTH=\"100%\">\n\n<tr>\n");
strcat(fadein_data, "<td><b><u>Name</u></b></td>\n");
strcat(fadein_data, "<td><b><u>Class</u></b></td>\n");
strcat(fadein_data, "<td><b><u>Religion</u></b></td>\n</tr>\n\n");
sprintf(fadeout_data, "</table>\n");
sprintf(buf, "<p>%d/%d Visible Players Online\n", pcountv, pcount);
strcat(fadeout_data, buf);
strcat(fadeout_data, "<p><b><u>Mudinfo Data for this Week</u></b>\n");
strcat(fadeout_data, "<br><table WIDTH=\"50%\">\n");
sprintf(buf, "<tr><td>Average Players Online</td> <td>%d</td></tr>\n",
(mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS])/mudinfo[MUDINFO_UPDATED]);
strcat(fadeout_data, buf);
sprintf(buf, "<tr><td>Peak Players Online</td> <td>%d</td></tr>\n", mudinfo[MUDINFO_PEAK_USERS]);
strcat(fadeout_data, buf);
sprintf(buf, "<tr><td>Mccp Usage</td> <td>%d %%</td></tr>\n",
100 * mudinfo[MUDINFO_MCCP_USERS] / (mudinfo[MUDINFO_MCCP_USERS] + mudinfo[MUDINFO_OTHER_USERS]));
strcat(fadeout_data, buf);
strcat(fadeout_data, "</table>\n");
strcat(fadeout_data, "<p>This Page is updated every 60 seconds");
strcat(fadeout_data, "</td></tr>\n");
strcat(fadeout_data, "</table></td></tr>\n");
strcat(fadeout_data, "</table>\n");
strcat(fadeout_data, "</table>\n");
strcat(fadeout_data, "</body>\n");
strcat(fadeout_data, "</html>\n");
/*
* Write it all to the file, and return.
*/
fprintf(fp, fadein_data);
fprintf(fp, body_data);
fprintf(fp, fadeout_data);
fclose (fp);
return;
}
void parse_top()
{
FILE *fp;
char topfile[200];
char buf[MAX_STRING_LENGTH];
char fadein_data[MAX_STRING_LENGTH];
char fadeout_data[MAX_STRING_LENGTH];
char body_data[4 * MAX_STRING_LENGTH]; // should be enough
int i;
sprintf(topfile, "%s%s", HTML_DIR, "top.html");
if ((fp = fopen(topfile, "w")) == NULL)
{
log_string("Error writing to top.html");
return;
}
sprintf(fadein_data, "<html>\n");
strcat(fadein_data, "<body text=\"#000000\" bgcolor=\"#FFFFFF\" link=\"#000000\" vlink=\"#000000\" alink=\"#0055FF\">\n");
strcat(fadein_data, "<table><br>\n");
strcat(fadein_data, "<table><pre>\n");
strcat(fadein_data, " <b><>==<>==<>==<>==<>==<>==<>== Top PKscore ==<>==<>==<>==<>==<>==<>==<></b>\n");
sprintf(fadeout_data, " <b><>==<>==<>==<>==<>==<>==<>== Top PKscore ==<>==<>==<>==<>==<>==<>==<></b>\n");
strcat(fadeout_data, "</pre>\n</table>\n</table>\n</body>\n</html>\n<p>\n");
strcat(fadeout_data, "<b>This page is updated once every 3 hours</b><br>\n");
sprintf(body_data, "\n");
for (i = 1; i <= MAX_TOP_PLAYERS / 2; i++)
{
sprintf(buf, " %2d. %-15s %5d %2d. %-15s %5d\n",
i, top_board[i].name, top_board[i].pkscore,
i + MAX_TOP_PLAYERS / 2, top_board[i + MAX_TOP_PLAYERS / 2].name,
top_board[i + MAX_TOP_PLAYERS / 2].pkscore);
strcat(body_data, buf);
}
strcat(body_data, "\n");
fprintf(fp, fadein_data);
fprintf(fp, body_data);
fprintf(fp, fadeout_data);
fclose (fp);
return;
}
void parse_leader()
{
FILE *fp;
char leaderfile[200];
char buf[MAX_STRING_LENGTH];
char fadein_data[MAX_STRING_LENGTH];
char fadeout_data[MAX_STRING_LENGTH];
char body_data[4 * MAX_STRING_LENGTH]; // should be enough
sprintf(leaderfile, "%s%s", HTML_DIR, "leader.html");
if ((fp = fopen(leaderfile, "w")) == NULL)
{
log_string("Error writing to leader.html");
return;
}
sprintf(fadein_data, "<html>\n");
strcat(fadein_data, "<body text=\"#000000\" bgcolor=\"#FFFFFF\" link=\"#000000\" vlink=\"#000000\" alink=\"#0055FF\">\n");
strcat(fadein_data, "<table><br>\n");
strcat(fadein_data, "<table><pre>\n");
strcat(fadein_data, " <b><>==<>==<>==<>==<>==<> Leader Board <>==<>==<>==<>==<>==<></b>\n");
sprintf(fadeout_data, " <b><>==<>==<>==<>==<>==<> Leader Board <>==<>==<>==<>==<>==<></b>\n");
strcat(fadeout_data, "</pre>\n</table>\n</table>\n</body>\n</html>\n<p>\n");
strcat(fadeout_data, "<b>This page is updated once every 3 hours</b><br>\n");
sprintf(body_data, "\n");
strcat(body_data, " Most Player Kills ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.pk_name);
strcat(body_data, buf);
sprintf(buf, " with %d Kills\n", leader_board.pk_number);
strcat(body_data, buf);
strcat(body_data, " Most Hours Played ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.time_name);
strcat(body_data, buf);
sprintf(buf, " with %d Hours\n", leader_board.time_number);
strcat(body_data, buf);
strcat(body_data, " Most Qps Earned ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.quest_name);
strcat(body_data, buf);
sprintf(buf, " with %d Qps\n", leader_board.quest_number);
strcat(body_data, buf);
strcat(body_data, " Most Mobs Killed ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.mobkills_name);
strcat(body_data, buf);
sprintf(buf, " with %d Kills\n", leader_board.mobkills_number);
strcat(body_data, buf);
strcat(body_data, " Highest PK score ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.pkscore_name);
strcat(body_data, buf);
sprintf(buf, " with %d Points\n", leader_board.pkscore_number);
strcat(body_data, buf);
strcat(body_data, " Most Arena Wins ---> ");
sprintf(buf, "<b>%-13s</b>", leader_board.arena_name);
strcat(body_data, buf);
sprintf(buf, " with %d Wins\n", leader_board.arena_number);
strcat(body_data, buf);
strcat(body_data, "\n");
fprintf(fp, fadein_data);
fprintf(fp, body_data);
fprintf(fp, fadeout_data);
fclose (fp);
return;
}