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: */
/*
 * pueblo.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 __PUEBLO_C__
#define __PUEBLO_C__ 1

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

#include "define.h"
#include "prototypes.h"
#include "obj_ur.h"
#include "obj_rm.h"
#ifdef NETLINKS
#	include "obj_nl.h"
#endif
#include "obj_sys.h"
#include "pueblo.h"
#include "music.h"
#include "comvals.h"


/* Online init. of pueblo.  (In case the login doesn't do it.) */
int chck_pblo(UR_OBJECT user, char *str)
{
	set_crash();
	if (user->pueblo==1) {
		user->pblodetect=0;
		if (!strncmp(str,"PUEBLOCLIENT",12)) return 1;
		else return 0;
		}
	if (!user->pblodetect) {
		if (!strncmp(str,"PUEBLOCLIENT",12)) return 1;
		else return 0;
		}
	if (!strncmp(str,"PUEBLOCLIENT",12)) {
		user->pueblo=1;
		user->pblodetect=0;
		write_user(user,"</xch_mudtext><font size=+2 color=\"#FFFFFF\">Pueblo has been detected!</font><xch_mudtext>\n");
		return 1;
		}
	user->pueblo=0;
	user->pblodetect=0;
	return 0;
}


int contains_pueblo(char *str)
{
	char *s;

	set_crash();
	if ((s=(char *)malloc(strlen(str)+1))==NULL) {
		write_syslog(ERRLOG, 1, "Failed to allocate memory in contains_pueblo().\n");
		return 0;
		}
	strcpy(s,str);
	strtolower(s); 
/* check to see if it contains a pueblo flag or a http:// so we don't
   convert "/~username/file.ext" into thinking its a color command. */
	if (strstr(s,"</xch_mudtext>")) { free(s); return 1; }
	if (strstr(s,"http://")) { free(s); return 1; }
	free(s);
	return 0;
}


void click_rm_access(UR_OBJECT user)
{
	UR_OBJECT u;
	RM_OBJECT rm;
	char *name;
	int cnt;

	set_crash();
        if ((rm=get_room(word[3]))==NULL) {
                write_user(user,nosuchroom);  return;
                }
        if (user->level<amsys->gatecrash_level && rm!=user->room) {
                write_user(user,"You have left that room.  Cannot perform access change.\n");
                return;
                }
        if (rm->access==PERSONAL_UNLOCKED || rm->access==PERSONAL_UNLOCKED) {
                write_user(user,"You cannot change the access of a personal room.\n");
                return;
                }
if (user->vis) name=user->name; else name=invisname;
if (rm->access>PRIVATE) {
        if (rm==user->room) 
                write_user(user,"This room's access is fixed.\n"); 
        else write_user(user,"That room's access is fixed.\n");
        return;
        }
if (!strcmp(word[2],"PUBLIC") && rm->access==PUBLIC) {
        if (rm==user->room) 
                write_user(user,"This room is already public.\n");  
        else write_user(user,"That room is already public.\n"); 
        return;
        }
if (user->vis) name=user->name; else name=invisname;
if (!strcmp(word[2],"PRIVATE")) {
        if (rm->access==PRIVATE) {
                if (rm==user->room) 
                        write_user(user,"This room is already private.\n");  
                else write_user(user,"That room is already private.\n"); 
                return;
                }
        cnt=0;
        for(u=user_first;u!=NULL;u=u->next) if (u->room==rm) ++cnt;
        if (cnt<amsys->min_private_users && user->level<amsys->ignore_mp_level) {
                sprintf(text,"You need at least %d users/clones in a room before it can be made private.\n", amsys->min_private_users);
                write_user(user,text);
                return;
                }
        write_user(user,"Room set to ~FRPRIVATE.\n");
        if (rm==user->room) {
                sprintf(text,"%s has set the room to ~FRPRIVATE.\n",name);
                write_room_except(rm,text,user);
                }
        else write_room(rm,"This room has been set to ~FRPRIVATE.\n");
        rm->access=PRIVATE;
        return;
        }
write_user(user,"Room set to ~FGPUBLIC.\n");
if (rm==user->room) {
        sprintf(text,"%s has set the room to ~FGPUBLIC.\n",name);
        write_room_except(rm,text,user);
        }
else write_room(rm,"This room has been set to ~FGPUBLIC.\n");
rm->access=PUBLIC;

/* Reset any invites into the room & clear review buffer */
for(u=user_first;u!=NULL;u=u->next) {
        if (u->invite_room==rm) u->invite_room=NULL;
        }
clear_revbuff(rm);
}


/* Executes all the main features. */
void pblo_exec(UR_OBJECT user, char *inpstr)
{
	set_crash();
	inpstr=remove_first(inpstr);
	if (!user->pueblo) return;
	if (!strcmp(word[1],"audioSTOP")) {
		write_user(user,"</xch_mudtext><img xch_sound=stop><xch_mudtext>");
		return;
		}
	if (!strcmp(word[1],"rmAccess")) {
		click_rm_access(user);
		return;
		}
if (!strcmp(word[1],"RoomConfig_setOpt")) {
        if (user->room->access==PERSONAL_UNLOCKED || user->room->access==PERSONAL_LOCKED) {
        	write_user(user,"Personal rooms do not have access controls.\n");
        	return;
        	}
		if (user->room->access==ROOT_CONSOLE) {
			write_user(user, "Root console do not have access controls.\n");
			return;
			}
        if ( user->level < command_table[FIX].level
                && user->level < command_table[UNFIX].level
                && user->level < command_table[CTOPIC].level
                && user->level < command_table[REVCLR].level
                && user->level < command_table[MYPAINT].level) {
                        if ( user->level >= command_table[PUBCOM].level
                             && user->level >= command_table[PRIVCOM].level) {
                                clear_words();
                                if (user->room->access==PUBLIC) { com_num=PRIVCOM; set_room_access(user); return; }
                                if (user->room->access==PRIVATE) { com_num=PUBCOM;  set_room_access(user); return; }
                                }
                        return;
                        }
        sprintf(text,"\n ---- Room Configuration Options : %s ----\n\n",user->room->name);  write_user(user,text);
        if (user->level >= command_table[FIX].level && user->level >= command_table[UNFIX].level) {
		vwrite_user(user, "        Room Type:  </xch_mudtext><b><a xch_cmd=\".%s %s\" xch_hint=\"Set this room's type to FIXED access.\">FIXED</a> / <a xch_cmd=\".%s %s\" xch_hint=\"Set this room's type to VARIABLE access.\">VARIABLE</a></b><xch_mudtext>\n", command_table[FIX].name, user->room->name, command_table[UNFIX].name, user->room->name);
		}
        if (user->level >= command_table[PUBCOM].level && user->level >= command_table[PRIVCOM].level) {
		vwrite_user(user, "           Access:  </xch_mudtext><b><a xch_cmd=\".pbloenh rmAccess PUBLIC %s\" xch_hint=\"Set this room's access to PUBLIC.\">PUBLIC</a> / <a xch_cmd=\".pbloenh rmAccess PRIVATE %s\" xch_hint=\"Set this room's access to PRIVATE.\">PRIVATE</a></b><xch_mudtext>\n", user->room->name,user->room->name);
                }
        if (user->level >= command_table[REVCLR].level) {
		vwrite_user(user, "    Review Buffer:  </xch_mudtext><b><a xch_cmd=\".%s %s\" xch_hint=\"Clear this room's speech review buffer.\">CLEAR REVIEW BUFFER NOW</a></b><xch_mudtext>\n", command_table[REVCLR].name, user->room->name);
                }                
        if (user->level >= command_table[CTOPIC].level) {
		vwrite_user(user, "       Room Topic:  </xch_mudtext><b><a xch_cmd=\".%s %s\" xch_hint=\"Clear this room's topic.\">CLEAR TOPIC NOW</a></b><xch_mudtext>\n", command_table[CTOPIC].name, user->room->name);
                }
/*        if (user->level >= command_table[MYPAINT].level
	      && user->can_edit_rooms
	      && user->room->access!=PERSONAL_UNLOCKED
	      && user->room->access!=PERSONAL_LOCKED) {
                sprintf(text," Room Description:  </xch_mudtext><b><a xch_cmd=\".rmdesc %s\" xch_hint=\"EDIT this room's description.\">EDIT DESCRIPTION</a></b><xch_mudtext>\n",user->room->name);
                write_user(user,text);
                }
*/	sprintf(text, "(%s)", user->name);
	strtolower(text);
	if (user->level >= command_table[MYPAINT].level
            && (user->room->access==PERSONAL_UNLOCKED
                || user->room->access==PERSONAL_LOCKED)
            && !strcmp(user->room->name, text)) {
                vwrite_user(user, " Room Description:  </xch_mudtext><b><a xch_cmd=\".%s\" xch_hint=\"Edit your PERSONAL ROOM description.\">EDIT DESCRIPTION</a></b><xch_mudtext>\n", command_table[MYPAINT].name);
                }
        write_user(user,"\n");
        return;
        }
if (word_count<3) return;
if (!strcmp(word[1],"vpic")) {
        vwrite_user(user, "</xch_mudtext><br><img src=\"%s\"><br><xch_mudtext>",inpstr);
        return;
        }
if (!strcmp(word[1],"audioPLAY")) {
	vwrite_user(user, "</xch_mudtext><img xch_sound=play href=\"%s\"><xch_mudtext>",inpstr);
        return;
        }
if (!strcmp(word[1],"audioVOL")) {
        if (!strcmp(word[2],"muteVOL")) write_user(user,"</xch_mudtext><img xch_volume=0><xch_mudtext>");
        if (!strcmp(word[2],"minVOL")) write_user(user,"</xch_mudtext><img xch_volume=33><xch_mudtext>");
        if (!strcmp(word[2],"medVOL")) write_user(user,"</xch_mudtext><img xch_volume=66><xch_mudtext>");
        if (!strcmp(word[2],"maxVOL")) write_user(user,"</xch_mudtext><img xch_volume=100><xch_mudtext>");
        return;
        }
}


void disp_song(UR_OBJECT user, int num)
{
	UR_OBJECT u;
	char *name;

	set_crash();
	if (user->vis) name=user->name;  else name=invisname;
	if (!user->vis) { sprintf(text,"%s[%s] ",colors[CSYSTEM],user->name); write_duty(user->level,text,user->room,user,0); }
	sprintf(text,"o/~ %s plays \"%s\" on the Jukebox. o/~\n",name,jb_titles[num]);
	write_room(user->room,text);
	sprintf(text,"~FMo/~ ~FYAudioPlayer~FM o/~~RS </xch_mudtext><b>[ <a xch_cmd=\".pbloenh audioSTOP\" xch_hint=\"Stop all audio.\">STOP</a> | <a xch_cmd=\".pbloenh audioPLAY %s%s%s\" xch_hint=\"Play this file.\">PLAY</a> |</b> Volume <b><a xch_cmd=\".pbloenh audioVOL muteVOL\" xch_hint=\"Mute\">Mute</a> : <a xch_cmd=\".pbloenh audioVOL minVOL\" xch_hint=\"Low Volume\">Soft</a> : <a xch_cmd=\".pbloenh audioVOL medVOL\" xch_hint=\"Normal Volume\">Normal</a> : <a xch_cmd=\".pbloenh audioVOL maxVOL\" xch_hint=\"High Volume\">Loud</a> ]</b><br><xch_mudtext>",reg_sysinfo[TALKERHTTP],reg_sysinfo[PUEBLOWEB],jb_files[num]);
	for (u=user_first; u!=NULL; u=u->next) {
		if (u->login || u->room!=user->room) continue;
		if (u->pueblo) write_user(u,text);
		}
}


void pblo_jukebox(UR_OBJECT user)
{
	int i=0,cnt=0,pos=0;

	set_crash();
if (word_count<2) {
        for (i=0; jb_titles[i][0]!='*'; i++) {
                cnt++;
                if (i==0) write_user(user,"Jukebox Song List\n\n");
                sprintf(text,"%3d: %-33s ",cnt,jb_titles[i]);
                write_user(user,text);
                if (pos) { write_user(user,"\n"); pos=0; }
                else pos=1;
                }
        if (pos) write_user(user,"\n");
        if (cnt) write_user(user,"\nUsage:  .jukebox <songnumber>\n");
        else write_user(user,"There are no song titles loaded in the jukebox.\n");
        return;
        }
if (is_number(word[1])) cnt=atoi(word[1]);
else { write_usage(user,"jukebox <songnumber>\n"); return; }
for (i=0; jb_titles[i][0]!='*'; i++) {
        if (i==cnt-1) { disp_song(user,i); break; }
        }
if (i!=cnt-1) write_user(user,"Song not found.\n");
}


/* Relist EXITS ... This will work for anyone, but users with Pueblo can
                    click on the non-private rooms to go there.  Netlinks
                    are not clickable, because they sometimes require pwds. */
void pblo_listexits(UR_OBJECT user)
{
	RM_OBJECT rm=user->room;
	char temp[125];
	int i,exits=0;

	set_crash();
if (rm->access!=PERSONAL_LOCKED && rm->access!=PERSONAL_UNLOCKED) sprintf(text,"The exits for this room (%s) are:",rm->name);
              else sprintf(text,"The exits for this personal room %s are:",rm->name);
write_user(user,text);
strcpy(text,"\n");
for(i=0;i<MAX_LINKS;++i) {
        if (rm->link[i]==NULL) break;
        if (rm->link[i]->access & PRIVATE)
                if (user->pueblo) sprintf(temp,"  ~FR%s",rm->link[i]->name);
                else sprintf(temp,"  ~FR%s",rm->link[i]->name);
        else {
                if (user->pueblo) sprintf(temp,"  </xch_mudtext><b><a xch_cmd=\".go %s\" xch_hint=\"Go to this room.\">%s</a></b><xch_mudtext>",rm->link[i]->name,rm->link[i]->name);
                else sprintf(temp,"  ~FG%s",rm->link[i]->name);
                }
        strcat(text,temp);
        ++exits;
        }
#ifdef NETLINKS
if (rm->netlink!=NULL && rm->netlink->stage==UP) {
        if (rm->netlink->allow==IN) sprintf(temp,"  ~FR%s*",rm->netlink->service);
        else sprintf(temp,"  ~FG%s*",rm->netlink->service);
        strcat(text,temp);
        }
else
#endif
	if (!exits) strcpy(text,"\n~FY(!) ~FRThere are no exits. ~FY(!)");
strcat(text,"\n");
write_user(user,text);
#ifdef NETLINKS
write_user(user," * indicates a netlink.\n\n");
#endif
}


/** ----------------------------------------------------------------------
     TalkerOS  AUDIO PROMPTER for Pueblo
    ---------------------------------------------------------------------- **/
int audioprompt(UR_OBJECT user, int prmpt, int pager)
{
	UR_OBJECT u;
	char audiofiles[8][30]={
        "ap_f-welcome.wav",     /* 00: Login greeting        (female)  */
        "ap_m-welcome.wav",     /* 01: Login greeting        (male)    */
        "ap_f-pager.wav",       /* 02: Pager sound           (female)  */
        "ap_m-pager.wav",       /* 03: Pager sound           (male)    */
        "ap_f-warning.wav",     /* 04: Warning sound         (female)  */
        "ap_m-warning.wav",     /* 05: Warning sound         (male)    */
        "ap_f-shutdown.wav",    /* 06: Shutdown/Reboot alert (female)  */
        "ap_m-shutdown.wav"     /* 07: Shutdown/Reboot alert (male)    */
        };

	set_crash();
if (user!=NULL) {
        /* Check user prefs. */
        if (!user->pueblo) return 0;
        if (!pager && !user->pueblo_mm) return 0;
        if (pager  && !user->pueblo_pg) return 0;

        /* Set to male voice if that is the user's preference. */
        if (user->voiceprompt) prmpt++;
        
        /* Send playback command */
        sprintf(text,"</xch_mudtext><img xch_sound=play xch_device=wav href=\"%s%s%s\"><xch_mudtext>",reg_sysinfo[TALKERHTTP],reg_sysinfo[PUEBLOWEB],audiofiles[prmpt]);
        write_user(user,text);
        return 1;
        }
/* If we get here then the announcement is to everyone. */
for (u=user_first; u!=NULL; u=u->next) {
        /* Check user prefs. */
        if (!u->pueblo || !u->pueblo_mm) continue;

        /* Send playback command */
        sprintf(text,"</xch_mudtext><img xch_sound=play xch_device=wav href=\"%s%s%s\"><xch_mudtext>",reg_sysinfo[TALKERHTTP],reg_sysinfo[PUEBLOWEB],audiofiles[prmpt+u->voiceprompt]);
        write_user(u,text);
        }
	return 0;
}


void query_img(UR_OBJECT user, char *inpstr)
{
	UR_OBJECT u;
	char *name;

	set_crash();
	if (word_count<2) {
		write_usage(user,"ppic <picture URL>");
		return;
		}
	if (amsys->ban_swearing && contains_swearing(inpstr) && user->level<MIN_LEV_NOSWR) {
		switch(amsys->ban_swearing) {
			case SBMIN:
				inpstr=censor_swear_words(inpstr);
				break;
			case SBMAX:
				write_user(user, noswearing);
				return;
			default : break; /* do nothing as ban_swearing is off */
			}
		}
	if (!strncmp(word[1],"http://",7)) {
		if (!(contains_extension(inpstr,0))) {
			write_user(user,"URL must end in either .jpg or .gif for a picture.\n");
			return;
			}
		if (user->vis) name=user->name;
		else name=invisname;
		if (!user->vis) {
			sprintf(text,"%s[%s] ",colors[CSYSTEM],user->name);
			write_duty(user->level,text,user->room,user,0);
			}
		sprintf(text,"%s suggests picture: %s\n",name,inpstr);
		write_room(user->room,text);
		sprintf(text,"-->  [ </xch_mudtext><a xch_cmd=\".pbloenh vpic %s\" xch_hint=\"View picture.\"><b>CLICK to view picture</b></a><xch_mudtext> ]\n",
			inpstr
			);
		for (u=user_first; u!=NULL; u=u->next) {
			if (!u->pueblo || u->login || u->room!=user->room)
				continue;
			write_user(u,text);
			}
		}
	else {
		write_user(user,"URL must begin with:  http://\n");
		return;
		}
}


void query_aud(UR_OBJECT user, char *inpstr)
{
	UR_OBJECT u;
	char *name;

	set_crash();
	if (word_count<2) {
		write_usage(user,"paudio <soundfile URL>");
		return;
		}
	if (contains_swearing(inpstr)) {
		write_user(user,noswearing);
		return;
		}
	if (!strncmp(word[1],"http://",7)) {
		if (!(contains_extension(inpstr,1))) {
			write_user(user,"URL must end in either .wav or .mid for an audio clip.\n");
			return;
			} 
		if (user->vis) name=user->name;
		else name=invisname;
		if (!user->vis) {
			sprintf(text,"%s[%s] ",colors[CSYSTEM],user->name);
			write_duty(user->level,text,user->room,user,0);
			}
		sprintf(text,"%s suggests audio: %s\n",name,inpstr);
		write_room(user->room,text);
		sprintf(text,"~FMo/~ ~FYAudioPlayer~FM o/~~RS </xch_mudtext><b>[ <a xch_cmd=\".pbloenh audioSTOP\" xch_hint=\"Stop all audio.\">STOP</a> | <a xch_cmd=\".pbloenh audioPLAY %s\" xch_hint=\"Play this file.\">PLAY</a> |</b> Volume <b><a xch_cmd=\".pbloenh audioVOL muteVOL\" xch_hint=\"Mute\">Mute</a> : <a xch_cmd=\".pbloenh audioVOL minVOL\" xch_hint=\"Low Volume\">Soft</a> : <a xch_cmd=\".pbloenh audioVOL medVOL\" xch_hint=\"Normal Volume\">Normal</a> : <a xch_cmd=\".pbloenh audioVOL maxVOL\" xch_hint=\"High Volume\">Loud</a> ]</b><br><xch_mudtext>",
			inpstr
			);
		for (u=user_first; u!=NULL; u=u->next) {
			if (!u->pueblo || u->login || u->room!=user->room)
				continue;
			write_user(u,text);
			}
		}
	else {
		write_user(user,"URL must begin with:  http://\n");
		return;
		}
}

#endif /* __PUEBLO_C__ */