lotos123/
lotos123/datafiles/conffiles/
lotos123/datafiles/counters/
lotos123/datafiles/fonts/
lotos123/datafiles/helpfiles/
lotos123/datafiles/killmsgs/
lotos123/datafiles/mapfiles/
lotos123/datafiles/motds/motd1/
lotos123/datafiles/motds/motd2/
lotos123/datafiles/pictfiles/
lotos123/datafiles/plfiles/
lotos123/datafiles/plfiles/helpfiles/
lotos123/datafiles/screens/
lotos123/datafiles/textfiles/
lotos123/datafiles/trfiles/
lotos123/datafiles/votefiles/
lotos123/datafiles/votefiles/1/
lotos123/datafiles/votefiles/2/
lotos123/src/plugins/
lotos123/userfiles/
lotos123/userfiles/bin/
/* vi: set ts=4 sw=4 ai: */
/*
 * plugin.c
 *
 *   Lotos v1.2.3  : (c) 1999-2003 Pavol Hluchy (Lopo)
 *   last update   : 30.1.2003
 *   email         : lotos@losys.sk
 *   homepage      : lotos.losys.sk
 */

#ifndef __PLUGIN_C__
#define __PLUGIN_C__ 1

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "define.h"
#include "prototypes.h"
#include "obj_sys.h"
#include "obj_pl.h"
#include "obj_syspp.h"

#include "plugin.h"

/* ---------------------------------------
    Begin PLUGIN INCLUDE code lines here. 
   --------------------------------------- */
#include "./plugins/eightball.c"
#include "./plugins/hangman.c"
/* -------------------------------------
    End PLUGIN INCLUDE code lines here. 
   ------------------------------------- */

void destroy_pl_cmd(CM_OBJECT c)
{
	set_crash();
/* Remove from linked list */
	if (c==cmds_first) {
		cmds_first=c->next;
		if (c==cmds_last) cmds_last=NULL;
		else cmds_first->prev=NULL;
		}
	else {
		c->prev->next=c->next;
		if (c==cmds_last) { 
			cmds_last=c->prev;
			cmds_last->next=NULL; 
                
			}
		else c->next->prev=c->prev;
		}
	free(c);
}

void destroy_plugin(PL_OBJECT p)
{
	set_crash();
/* Remove from linked list */
	if (p==plugin_first) {
		plugin_first=p->next;
		if (p==plugin_last) plugin_last=NULL;
		else plugin_first->prev=NULL;
		}
	else {
		p->prev->next=p->next;
		if (p==plugin_last) { 
			plugin_last=p->prev;
			plugin_last->next=NULL; 
			}
		else p->next->prev=p->prev;
		}
	free(p);
}

void save_plugin_data(UR_OBJECT user)
{
	PL_OBJECT plugin;
	int i=0;

	set_crash();
	for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next) {
		if (!i && plugin->req_userfile) { call_plugin_exec(user,"",plugin,-7); i++; }
		else if (plugin->req_userfile) { call_plugin_exec(user,"",plugin,-8); i++; }
		}
}

int call_plugin_exec(UR_OBJECT user, char *str, PL_OBJECT plugin, int comnum)
{
	set_crash();
/* ---------------------------------------------------
   Put third-party plugin command calls here!
   example:  if (!strcmp(plugin->registration,"00-000")) { pl00x000_main(user,str,comnum); return 1; }
   --------------------------------------------------- */
	if (!strcmp(plugin->registration,"00-100")) { pl00x100_main(user,str,comnum); return 1; }
	if (!strcmp(plugin->registration,"02-100")) { pl02x100_main(user,str,comnum); return 1; }
/* ---------------------------------------------------
   End third-party plugin comand calls here.
   --------------------------------------------------- */
	return 0;
}

int oss_run_plugins(UR_OBJECT user, char *str, char *comword, int len)
{
	CM_OBJECT com;

	set_crash();
	for (com=cmds_first; com!=NULL; com=com->next) {
		if (!(!strncmp(comword,com->command,len))) continue;
		if (user->level < com->req_lev) return 0;
		if (!call_plugin_exec(user,str,com->plugin,com->comnum)) return 0;
		return 1;
		}
	return 0;
}

int oss_plugin_dump(void)
{
	PL_OBJECT p,p2;
	CM_OBJECT c,c2;

	set_crash();
	for (c=cmds_first; c!=NULL; c=c2) { c2=c->next; destroy_pl_cmd(c); }
	for (p=plugin_first; p!=NULL; p=p2) { p2=p->next; call_plugin_exec(NULL,"",p,-6); destroy_plugin(p); }
	return 1;
}

void plugin_triggers(UR_OBJECT user, char *str)
{
	PL_OBJECT plugin;

	set_crash();
	for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next) {
	if (plugin->triggerable) call_plugin_exec(user,str,plugin,-5);
	}
}

void load_plugin_data(UR_OBJECT user)
{
	PL_OBJECT plugin;

	set_crash();
	for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next)
		if (plugin->req_userfile) call_plugin_exec(user,"",plugin,-9);
}

void disp_plugin_registry(UR_OBJECT user)
{
	PL_OBJECT plugin;
	CM_OBJECT com;
	int cm=0,total=0;

	set_crash();
/* write data for each loaded plugin */
for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next) {
        if (!total) {
                sprintf(text,"\n%s%s                      Lotos  Plugin  Module  Registry                   \n\n",colors[CHIGHLIGHT],colors[CTEXT]);
                write_user(user,text);
                write_user(user,"~FTPos: ID-Auth : Name                       : Cmds : Ver : Author\n");
                }
        /* search for associated commands */
        cm=0; for (com=cmds_first; com!=NULL; com=com->next) if (com->plugin==plugin) cm++;
        /* write data to user */
        sprintf(text,"%3d: %-7s : %-26s :  %2d  : %-3s : %-21s\n",total,plugin->registration,plugin->name,cm,plugin->ver,plugin->author);
        write_user(user,text);
        total++;
        }
if (!total) write_user(user,"No plugins are loaded on this system.\n");
else write_user(user,"\n");
}

/*** Construct plugin object ***/
PL_OBJECT create_plugin(void)
{
	PL_OBJECT plugin;

	set_crash();
	if ((plugin=(PL_OBJECT)malloc(sizeof(struct plugin_struct)))==NULL) {
		write_syslog(ERRLOG, 1, "Memory allocation failure in create_plugin().\n");
		return NULL;
		}

/* Append object into linked list. */
if (plugin_first==NULL) {  
        plugin_first=plugin;  plugin->prev=NULL;  
        }
else {  
        plugin_last->next=plugin;  plugin->prev=plugin_last;  
        }
plugin->next=NULL;
plugin_last=plugin;

/* initialise plugin location structure */
plugin->name[0]='\0';
plugin->author[0]='\0';
plugin->ver[0]='\0';
plugin->req_ver[0]='\0';
plugin->registration[0]='\0';
plugin->id=-1;
return plugin;
}

/* -------------------
    Lotos Debuger
   ------------------- */
void oss_debugger(UR_OBJECT user)
{
	set_crash();
	if (word_count<2) {
		write_user(user,"Lotos DEBUGGER:  Specifikuj debug modul/parametre.\n");
		return;
		}
	if (!strncmp(word[1],"com",3)) {
		oss_debug_commands(user);
		return;
		}
	if (syspp->oss_highlev_debug && !strncmp(word[1],"inp",3)) {
		oss_debug_allinput(user);
		return;
		}
	if (!strncmp(word[1],"plug",4)) {
		oss_debug_plugindata(user);
		return;
		}
}

void oss_debug_commands(UR_OBJECT user)
{
	PL_OBJECT plugin;
	CM_OBJECT com;
	int i=0,pos=0,sysN=0,plc=0,pl=0,total=0;

	set_crash();
	for (i=0; command_table[i].name[0]!='*'; i++) {
		if (!total) write_user(user,"\n        Lotos DEBUGGER:  Command Listing by Memory Address\n\n");
        if (!pos) write_user(user,"  ");
        total++;  sysN++;  pos++;
        sprintf(text,"%10s - %3d   ",command_table[i].name,sysN);
        write_user(user,text);
        if (pos==3) { pos=0; write_user(user,"\n"); }
        }

for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next) {
        if (!total) write_user(user,"\n        Lotos DEBUGGER:  Command Listing by Addressable Location\n\n");
        for (com=cmds_first; com!=NULL; com=com->next) {
                if (com->plugin != plugin) continue;
                if (!pos) write_user(user,"  ");
                total++;  plc++;  pos++;
                sprintf(text,"%10s - %3dx%-4d   ",com->command,com->comnum,plugin->id);
                write_user(user,text);
                if (pos==3) { pos=0; write_user(user,"\n"); }
                }
        pl++;
        }
if (pos!=4) write_user(user,"\n");
sprintf(text,"\nDebuger:  Addressable command search finished.\n           Najdenych spolu %d prikazov.\n           %d Lotos  /  %d z %d plugin-ov.\n\n",total,sysN,plc,pl);
write_user(user,text);
}

void oss_debug_allinput(UR_OBJECT user)
{
	set_crash();
	if (syspp->debug_input) {
		syspp->debug_input=0;
		syspp->highlev_debug_on--;
		write_syslog(SYSLOG, 1, "%s deaktivoval Debuger systemoveho vstupu.\n",user->name);
		sprintf(text,"\n%s%sSYSTEM Debuger:  Logovanie vstupu bolo deaktivovane.\n\n",colors[CBOLD],colors[CSYSBOLD]);
		write_room_except(NULL,text,user);
		write_user(user,"Debuger:  Logovanie vstupu bolo deaktivovane.\n");
		}
	else {
		syspp->debug_input=1;
		syspp->highlev_debug_on++;
		write_syslog(SYSLOG, 1, "%s activated the System Input Debugger.\n",user->name);
		sprintf(text,"\n%s%sSYSTEM Debugger:  Input logging has been activated!\n                  NOTE:  *ALL* commands, speech, and text are being\n                         logged for debugging and testing purposes.\n\n",colors[CBOLD],colors[CSYSBOLD]);
		write_room_except(NULL,text,user);
		write_user(user,"Debugger:  Input logging has been activated!\n           ~OLNOTE: If left on, this command will *rapidly* fill up the system log.\n");
		}
}

void oss_debug_plugindata(UR_OBJECT user)
{
	PL_OBJECT plugin=plugin_first;
	CM_OBJECT cmd;
	int num=-1,cnt=0,found=0;

	set_crash();
if (word_count<3) {
	write_user(user,"DEBUG PluginData requires the plugin position to retrieve data.\n");
	return;
	}
if ((num=atoi(word[2]))==-1) {
	write_user(user,"DEBUG PluginData requires the NUMERICAL position for data retrieval.\n");
	return;
	}
write_user(user,"Lotos DEBUGGER:  Retrieving addressable plugin information by location...\n\n");
if (plugin_first!=NULL) {
        for (plugin=plugin_first; plugin!=NULL; plugin=plugin->next) {
                if (cnt==num) { found++; break; }
                cnt++;
                }
        }        
if (!found) { write_user(user,"No addressable plugins found in system memory.  Check .plugreg for details.\n"); return; }
sprintf(text,"Plugin and Associated Commands data for registry position: %d\n\n",cnt);
write_user(user,text);
sprintf(text,"Registered ID: %-7s                            Local ID      : %3d\n",plugin->registration,plugin->id);
write_user(user,text);
sprintf(text,"Author Name  : %-22s             Plugin Version: %3s\n",plugin->author,plugin->ver);
write_user(user,text);
sprintf(text,"Description  : %-27s        Int Ver. Req'd: %3s\n",plugin->name,plugin->req_ver);
write_user(user,text);
sprintf(text,"Uses Userdata: %-3s                                Triggerable   : %-3s\n\n",noyes2[plugin->req_userfile],noyes2[plugin->triggerable]);
write_user(user,text);
cnt=0;
for (cmd=cmds_first; cmd!=NULL; cmd=cmd->next) {
        if (cmd->plugin != plugin) continue;
        cnt++;
        write_user(user,"   Associated Command\n   ------------------\n");
        sprintf(text,"   Command ID: %3d                        Full Address: %3dx%d\n",cmd->comnum,cmd->comnum,cmd->id);
        write_user(user,text);
        sprintf(text,"   Name      : %-20s       Level Req'd : %s\n\n",cmd->command,user_level[cmd->req_lev].name);
        write_user(user,text);
        }
if (!cnt) write_user(user,"   (No commands associated with this plugin.)\n");
write_user(user,"Debugger:  Search finished.\n");
}

void oss_debug_alert(UR_OBJECT user)
{
	set_crash();
	if (syspp->highlev_debug_on) {
		write_user(user,"~OL~FYATTENTION!!!     ATTENTION!!!   ATTENTION!!!\n\n");
		write_user(user,"Higher-level debug features are currently active on this\n");
		write_user(user,"system.  You are being informed for privacy reasons.  Do\n");
		write_user(user,"NOT send private information or change your password until\n");
		write_user(user,"this message no longer appears when you log in.  See the\n");
		write_user(user,"~OL.tinfo~RS command for status information.\n\n");
		}
}

CM_OBJECT create_cmd(void)
{
	CM_OBJECT cmd;

	set_crash();
	if ((cmd=(CM_OBJECT)malloc(sizeof(struct plugin_cmd)))==NULL) {
		write_syslog(ERRLOG, 1, "Memory allocation failure in create_cmd().\n");
		return NULL;
		}

/* Append object into linked list. */
	if (cmds_first==NULL) {  
		cmds_first=cmd;
		cmd->prev=NULL;  
		}
	else {  
		cmds_last->next=cmd;
		cmd->prev=cmds_last;  
		}
	cmd->next=NULL;
	cmds_last=cmd;

/* initialise plugin command structure */
	cmd->command[0]='\0';
	cmd->id=-1;
	cmd->comnum=-1;
	cmd->req_lev=99;
	cmd->plugin=NULL;
	return cmd;
}


void load_plugins(void)
{
	int tmp=0, cmd=0;
	set_crash();
/* --------------------------------------------------
   Place third-party plugin initialization calls HERE
   Ex: if ((tmp=pl00x000_init(cmd))) cmd=cmd+tmp;
   -------------------------------------------------- */
	if ((tmp=pl00x100_init(cmd))) cmd=cmd+tmp;
	if ((tmp=pl02x100_init(cmd))) cmd=cmd+tmp;
/* ------------------------------------------------
   End third-party plugin initialization calls HERE
   ------------------------------------------------ */
}

#endif /* __PLUGIN_C__ */