37 #include <svnversion.h> 53 static void do_sql(
const char *sql, sqlite3 *base) {
60 err = sqlite3_exec(base, sql, NULL, NULL, &msg);
61 if (err != SQLITE_OK) {
70 int nrow, ncolumn, id;
75 sql = sqlite3_mprintf(
"select reg_id from region where reg_name='%q'", reg->
name);
79 id = atoi(line[ncolumn]);
82 sql = sqlite3_mprintf(
"insert into region(reg_name) values( '%q' )", reg->
name);
87 sqlite3_free_table(line);
106 const char *propname;
110 va_start(args, type);
111 propname = va_arg(args,
const char *);
113 if (!strcmp(propname,
"Identification")) {
114 buf = va_arg(args,
char *);
115 size = va_arg(args,
int);
121 if (!strcmp(propname,
"FullName")) {
122 buf = va_arg(args,
char *);
123 size = va_arg(args,
int);
142 va_start(args, type);
143 event_code = va_arg(args,
int);
145 switch (event_code) {
159 snprintf(path, 500,
"%s/cflogger.db", dir);
168 snprintf(path, 500,
"%s/cfnewspaper.db", dir);
208 static void news_cat(
char *buffer,
int size,
const char *format, ...) {
211 size -= strlen(buffer)-1;
212 buffer += strlen(buffer);
214 va_start(args, format);
215 vsprintf(buffer, format, args);
219 static void do_kills(
char *buffer,
int size, time_t start, time_t end,
const char *reg,
kill_format *format) {
226 const char *raw_players =
"select sum(1) as deaths from kill_event inner join living on liv_id = ke_victim_id where liv_is_player = %d and ke_time >= %d and ke_time < %d %s";
227 const char *raw_monsters =
"select sum(1) as deaths from kill_event inner join living on liv_id = ke_victim_id where liv_is_player = %d and ke_time >= %d and ke_time < %d";
229 sql = sqlite3_mprintf(raw_players, 1, start, end, reg);
230 err = sqlite3_get_table(
logger_database, sql, &results, &nrow, &ncolumn, &msg);
232 if (err != SQLITE_OK) {
236 if (nrow > 0 && results[ncolumn] != NULL)
237 deaths = atoi(results[ncolumn]);
238 sqlite3_free_table(results);
242 else if (deaths == 1)
248 sql = sqlite3_mprintf(raw_monsters, 0, start, end);
249 err = sqlite3_get_table(
logger_database, sql, &results, &nrow, &ncolumn, &msg);
251 if (err != SQLITE_OK) {
255 if (nrow > 0 && results[ncolumn] != NULL)
256 deaths = atoi(results[ncolumn]);
257 sqlite3_free_table(results);
261 else if (deaths == 1)
276 f.
no_monster_death =
"No monster was killed, players were lazy around here.";
281 snprintf(where, 50,
"and map_reg_id = %d", region_id);
283 do_kills(buffer, size, start, end, where, &f);
286 static void do_region(
region *reg,
char *buffer,
int size, time_t start, time_t end) {
287 news_cat(buffer, size,
"--- local %s news ---\n", reg->
name);
296 f.
one_player_death =
"Only one player died in the whole world, May Fido(tm) Have Mercy.";
297 f.
many_player_death =
"Monsters all around the world were busy, %d players died.";
298 f.
no_monster_death =
"No monster was killed at all, players must be tired!";
299 f.
one_monster_death =
"One poor monster was killed in the whole world, too bad for it.";
301 do_kills(buffer, size, start, end,
"", &f);
304 static void do_world(
char *buffer,
int size, time_t start, time_t end) {
305 news_cat(buffer, size,
"--- worldnews section ---\n");
327 sql = sqlite3_mprintf(
"select * from time where time_ingame < '%q' order by time_ingame desc", date);
328 err = sqlite3_get_table(
logger_database, sql, &results, &nrow, &ncolumn, &msg);
330 if (err != SQLITE_OK) {
334 if (nrow > 1 && results[ncolumn+1] != NULL) {
335 end = atol(results[ncolumn+1]);
336 if (nrow > 1 && results[ncolumn+2] != NULL)
337 start = atol(results[ncolumn+2]);
343 do_region(reg, contents, 5000, start, end);
346 do_world(contents, 5000, start, end);
365 va_start(args, type);
366 who = va_arg(args,
object *);
368 activator = va_arg(args,
object *);
369 va_arg(args,
object *);
370 va_arg(args,
char *);
373 event = va_arg(args,
object *);
374 event_code =
event->subtype;
f_plug_api unregisterGlobalEvent
#define CFAPI_OBJECT_PROP_NAME
struct paper_properties paper_properties
void cf_get_time(timeofday_t *tod)
sstring slaying
Which race to do double damage to.
region * cf_map_get_region_property(mapstruct *map, int propcode)
static void do_sql(const char *sql, sqlite3 *base)
#define CFAPI_OBJECT_PROP_NAME_PLURAL
static paper_properties * get_newspaper(const char *name)
static void do_kills(char *buffer, int size, time_t start, time_t end, const char *reg, kill_format *format)
#define CFAPI_OBJECT_PROP_MESSAGE
Represents the ingame time.
int initPlugin(const char *iversion, f_plug_api gethooksptr)
The server calls this function after loading the plugin.
static void do_world(char *buffer, int size, time_t start, time_t end)
static sqlite3 * newspaper_database
static void get_newspaper_content(object *paper, paper_properties *properties, region *reg)
int postInitPlugin(void)
The server calls this function to actually initialize the plugin here, after object handlers are regi...
void cf_log(LogLevel logLevel, const char *format,...)
Wrapper for LOG().
int eventListener(int *type,...)
Handles an object-related event.
int cf_init_plugin(f_plug_api getHooks)
int cfnewspaper_globalEventListener(int *type,...)
struct kill_format kill_format
int closePlugin(void)
called before the plugin gets unloaded from memory.
static void read_parameters(void)
char * name
Shortend name of the region as maps refer to it.
object * cf_object_insert_object(object *op, object *container)
static void do_world_kills(char *buffer, int size, time_t start, time_t end)
struct mapstruct * map
Pointer to the map in which this object is present.
static paper_properties default_properties
static sqlite3 * logger_database
CF_PLUGIN char SvnRevPlugin[]
void * getPluginProperty(int *type,...)
The server calls this function to get information about the plugin, notably the name and version...
int cfnewspaper_runPluginCommand(object *op, char *params)
static void news_cat(char *buffer, int size, const char *format,...)
static void format_time(timeofday_t *tod, char *buffer, int size)
#define CFAPI_MAP_PROP_REGION
const char * cf_get_directory(int id)
Gets a directory Crossfire uses.
f_plug_api registerGlobalEvent
static void do_region_kills(region *reg, char *buffer, int size, time_t start, time_t end)
#define EVENT_APPLY
Object applied-unapplied.
static void do_region(region *reg, char *buffer, int size, time_t start, time_t end)
void cf_object_set_string_property(object *op, int propcode, const char *value)
static int get_region_id(region *reg)
object * cf_create_object_by_name(const char *name)
Wrapper for create_archetype() and create_archetype_by_object_name().
void(* f_plug_api)(int *type,...)
General API function.