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: */
/*
 * poc_zoz.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 __POC_ZOZ_C__
#define __POC_ZOZ_C__ 1

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

#include "define.h"
#include "prototypes.h"
#include "obj_ur.h"
#include "obj_syspp.h"
#include "poc_zoz.h"


void load_counters(void)
{
	FILE *fp;
	int err=0, i, tmp=0;

	set_crash();
	printf("Nacitavam pocitadla ");
	if ((fp=fopen(TCOUNTER, "r"))==NULL) {
		write_syslog(ERRLOG, 0, "Nemozem otvorit fajl s tcountrom, nulujem\n");
		for (i=0; i<4; i++) {
			syspp->tcounter[i]=0;
			printf(".");
			}
		err=1;
		}
	else {
		fscanf(fp, "%ld %ld %ld %ld",
			&syspp->tcounter[0], &syspp->tcounter[1],
			&syspp->tcounter[2], &syspp->tcounter[3]
			);
		fclose(fp);
		printf("....");
		}
	for (i=0; i<3; i++)
		tmp+=syspp->tcounter[i];
	if (tmp!=syspp->tcounter[3]) {
		err=1;
		write_syslog(ERRLOG, 0, "Chybne ulozeny sucet conutrov, prepocitavam novy\n");
		syspp->tcounter[3]=tmp;
		}
	for (i=0; i<4; i++) {
		syspp->bcounter[i]=0;
		printf(".");
	}
	for (i=0; i<4; i++) {
		syspp->acounter[i]=0;
		printf(".");
		}

	if ((fp=fopen(MCOUNTER, "r"))==NULL) {
		write_syslog(ERRLOG, 0, "Nemozem otvorit fajl s mcountrom, nulujem\n");
		for (i=0; i<4; i++) {
			syspp->mcounter[i]=0;
			printf(".");
			}
		err=1;
		}
	else {
		fscanf(fp, "%ld %ld %ld %ld",
			&syspp->mcounter[0], &syspp->mcounter[1],
			&syspp->mcounter[2], &syspp->mcounter[3]
			);
		fclose(fp);
		printf("....");
		}

	printf(" OK");
	if (!err) printf("\n");
	else printf(" kukni \033[1m\033[31merrlog\033[0m\n");
}


void save_counters(void)
{
	FILE *fp;
	int i;

	set_crash();
	if ((fp=fopen(TCOUNTER, "w"))==NULL) {
		write_syslog(ERRLOG, 1, "Nemozem otvorit tcounter fajl pre zapis v save_counters()\n");
		return;
		}
	for (i=0; i<4; i++)
		fprintf(fp, "%ld ", syspp->tcounter[i]);
	fprintf(fp, "\n");
	fclose(fp);

	if ((fp=fopen(MCOUNTER, "w"))==NULL) {
		write_syslog(ERRLOG, 1, "Nemozem otvorit mcounter fajl pre zapis v save_counters()\n");
		return;
		}
	for (i=0; i<4; i++)
		fprintf(fp, "%ld ", syspp->mcounter[i]);
	fprintf(fp, "\n");
	fclose(fp);
}


void show_counters(UR_OBJECT user)
{
	set_crash();
	write_user(user, "Aktualny stav pocitadiel:\n\n");
	write_user(user, "                   Loginy                      Useri\n");
	write_user(user, "Pohlavie   |   Total        Boot     |  Maximum     Aktual\n");
	write_user(user, "-----------+-------------------------+--------------------\n");
	vwrite_user(user,"Muzi       |  %6ld      %6ld     |  %6ld      %6ld\n",
		syspp->tcounter[1], syspp->bcounter[1], syspp->mcounter[1], syspp->acounter[1]);
	vwrite_user(user,"Zeny       |  %6ld      %6ld     |  %6ld      %6ld\n",
		syspp->tcounter[2], syspp->bcounter[2], syspp->mcounter[2], syspp->acounter[2]);
	vwrite_user(user,"Neurcite   |  %6ld      %6ld     |  %6ld      %6ld\n",
		syspp->tcounter[0], syspp->bcounter[0], syspp->mcounter[0], syspp->acounter[0]);
	write_user(user, "-----------+-------------------------+--------------------\n");
	vwrite_user(user,"Spolu      |  %6ld      %6ld     |  %6ld      %6ld\n",
		syspp->tcounter[3], syspp->bcounter[3], syspp->mcounter[3], syspp->acounter[3]);
}


int count_musers(UR_OBJECT user, char *inpstr)
{
	int i=0, count=0;
	int lastspace=0, lastcomma=0, gotchar=0;
	int point=0, point2=0;
	char multiliststr[ARR_SIZE];
	char *strbck, *p=inpstr;

	set_crash();
	strbck=strdup(inpstr);
	reset_murlist(user);

	for (i=0; i<strlen(inpstr); ++i) {
		if (inpstr[i]==' ') {
			if (lastspace && !gotchar) {
				point++;
				point2++;
				continue;
				}
			if (!gotchar) {
				point++;
				point2++;
				}
			lastspace=1;
			continue;
			} /* end of if space */
		else if (inpstr[i]=='+') {
			if (!gotchar) {
				lastcomma=1;
				point++;
				point2++;
				continue;
				}
			else {
				if (count <= MAX_MUSERS-1) {
					if (((point2-1)-point)<=USER_NAME_LEN)
						midcpy(inpstr, user->murlist[count],point,point2-1);
					count++;
					}
				point=i+1;
				point2=point;
				gotchar=0;
				lastcomma=1;
				continue;
				}
			} /* end of if comma */
		if ((inpstr[i-1]==' ') && (gotchar)) {
			if (count <= MAX_MUSERS-1) {
				if (((point2-1)-point)<=USER_NAME_LEN)
					midcpy(inpstr,user->murlist[count],point,point2-1);
				count++;  
				}
			break;
			}
		gotchar=1;
		lastcomma=0;
		lastspace=0;
		point2++;
		} /* end of for */
	midcpy(inpstr,multiliststr,i,ARR_SIZE);

	if (!strlen(multiliststr)) {
		/* no message string, copy last user */
		if ((point2-point)<=USER_NAME_LEN)
		midcpy(inpstr,user->murlist[count],point,point2);
		count++;
		inpstr[0]='\0';
		}
	else {
		strcpy(inpstr,multiliststr);
		multiliststr[0]=0;
		}

	i=0;
	point=0;
	point2=0;
	gotchar=0;
	inpstr=p;
	strcpy(inpstr, strbck);
	free(strbck);
	return count;
}


void list_txt_files(UR_OBJECT user)
{
	DIR *dirp;
	FILE *ifp, *ofp;
	struct dirent *dp;
	char fname[FNAME_LEN];
	int cnt=0, tcnt=0;

	set_crash();
	if (!user) printf("Vytvaram zoznam textovych suborov ... ");
	else write_user(user, "Vytvaram zoznam textovych suborov ");

	if (!(dirp=opendir(TEXTFILES))) {
		if (!user) {
			fprintf(stderr, "\nLotos: Directory open failure in list_txt_files().\n");
			boot_exit(101);
			}
		else {
			write_user(user, "\nLotos: Directory open failure in list_txt_files().\n");
			return;
			}
		}
	sprintf(fname, "%s/showfiles.tmp", TEMPFILES);
	if ((ofp=fopen(fname, "w"))==NULL) {
		(void) closedir(dirp);
		if (!user) {
			fprintf(stderr, "\nLotos: Nemozem vytvorit tempfajl v list_txt_files().\n");
			boot_exit(102);
			}
		else {
			write_user(user, "\nLotos: Nemozem vytvorit tempfajl v list_txt_files().\n");
			return;
			}
		}
	fprintf(ofp, "\n+----- ~FG~OLFiles~RS ----------------------------------------------------------------+\n\n");
	fprintf(ofp, "Precitaj si nasledujuce subory pre dalsie informacie o talkri.\n\n");

	while((dp=readdir(dirp))!=NULL) {
		if (!strcmp(dp->d_name, ".")
		    || !strcmp(dp->d_name, "..")
		    || !strcmp(dp->d_name, "adminsfiles")
		    ) continue;
		sprintf(fname, "%s/%s", TEXTFILES, dp->d_name);
		if ((ifp=fopen(fname, "r"))==NULL) {
			(void) closedir(dirp);
			if (!user) {
				fprintf(stderr, "\nLotos: Nemozem otvorit subor na citanie v list_txt_files().\n");
				boot_exit(103);
				}
			else {
				write_user(user, "\nLotos: Nemozem otvorit subor na citanie v list_txt_files().\n");
				return;
				}
			}
		fgets(text, ARR_SIZE-1, ifp);
		fclose(ifp);
		if (user) write_user(user, ".");
		fprintf(ofp, "* ~OL%-8.8s~RS - %-67.67s\n", dp->d_name, text);
		cnt++;
		}
	(void) closedir(dirp);
	if (!cnt) fprintf(ofp, "Momentalne neni su ziadne subory\n");
	fprintf(ofp, "+----------------------------------------------------------------------------+\n\n");
	fclose(ofp);
	sprintf(fname, "%s/showfiles.tmp", TEMPFILES);
	unlink(SHOWFILES);
	rename(fname, SHOWFILES);
	tcnt=cnt;

	cnt=0;
	if (!(dirp=opendir(ADMINFILES))) {
		if (!user) {
			fprintf(stderr, "\nLotos: Directory open failure in list_txt_files().\n");
			boot_exit(101);
			}
		else {
			write_user(user, "\nLotos: Directory open failure in list_txt_files().\n");
			return;
			}
		}
	sprintf(fname, "%s/showfiles.tmp", TEMPFILES);
	if ((ofp=fopen(fname, "w"))==NULL) {
		closedir(dirp);
		if (!user) {
			fprintf(stderr, "\nLotos: Nemozem vytvorit tempfajl v list_txt_files().\n");
			boot_exit(102);
			}
		else {
			write_user(user, "\nLotos: Nemozem vytvorit tempfajl v list_txt_files().\n");
			return;
			}
		}
	fprintf(ofp, "\n+----- ~FG~OLAdmin Files~RS ----------------------------------------------------------+\n\n");
	fprintf(ofp, "Precitaj si nasledujuce subory pre dalsie admin informacie o talkri.\n\n");

	while((dp=readdir(dirp))!=NULL) {
		if (!strcmp(dp->d_name, ".")
		    || !strcmp(dp->d_name, "..")
		    ) continue;
		sprintf(fname, "%s/%s", ADMINFILES, dp->d_name);
		if ((ifp=fopen(fname, "r"))==NULL) {
			closedir(dirp);
			fclose(ofp);
			if (!user) {
				fprintf(stderr, "\nLotos: Nemozem otvorit subor na citanie v list_txt_files().\n");
				boot_exit(103);
				}
			else {
				write_user(user, "\nLotos: Nemozem otvorit subor na citanie v list_txt_files().\n");
				return;
				}
			}
		fgets(text, ARR_SIZE-1, ifp);
		fclose(ifp);
		if (user) write_user(user, ".");
		fprintf(ofp, "* ~OL%-8.8s~RS - %-67.67s\n", dp->d_name, text);
		cnt++;
		}
	(void) closedir(dirp);
	if (!cnt) fprintf(ofp, "Momentalne neni su ziadne subory\n");
	fprintf(ofp, "+----------------------------------------------------------------------------+\n\n");
	fclose(ofp);
	sprintf(fname, "%s/showfiles.tmp", TEMPFILES);
	unlink(SHOWAFILES);
	rename(fname, SHOWAFILES);
	tcnt+=cnt;
	if (!user) printf(" spolu %d\n", tcnt);
	else vwrite_user(user, " spolu %d\n", tcnt);
}


void list_pic_files(UR_OBJECT user)
{
	DIR *dirp;
	FILE *ofp;
	struct dirent *dp;
	char fname[FNAME_LEN];
	char fntname[50];
	int cnt=0, cl, pc;

	set_crash();
	if (!user) printf("Vytvaram zoznam obrazkovych suborov ... ");
	else write_user(user, "Vytvaram zoznam obrazkovych suborov ");

	if (!(dirp=opendir(PICTFILES))) {
		if (!user) {
			fprintf(stderr, "\nLotos: Directory open failure in list_pic_files().\n");
			boot_exit(101);
			}
		else {
			write_user(user, "\nLotos: Directory open failure in list_pic_files().\n");
			return;
			}
		}
	sprintf(fname, "%s/pictfiles.tmp", TEMPFILES);
	if ((ofp=fopen(fname, "w"))==NULL) {
		(void) closedir(dirp);
		if (!user) {
			fprintf(stderr, "\nLotos: Nemozem vytvorit tempfajl v list_pic_files().\n");
			boot_exit(102);
			}
		else {
			write_user(user, "\nLotos: Nemozem vytvorit tempfajl v list_pic_files().\n");
			return;
			}
		}
	fprintf(ofp, "\n+----- ~FG~OLZoznam obrazkov~RS ------------------------------------------------------+\n\n");

	pc=0;
	while ((dp=readdir(dirp))!=NULL) {
		if (!strcmp(dp->d_name, ".")
		    || !strcmp(dp->d_name, "..")
		    || !strncmp(dp->d_name, ".pic", 4)
		    ) continue;
		sprintf(fname, "%s/%s", PICTFILES, dp->d_name);
		if ((cl=count_lines(fname))==0) continue;
		strcpy(fntname, dp->d_name);
		fntname[strlen(fntname)-4]='\0';
		if (cl>23) fprintf(ofp, "~OL~FR%-19.19s~RS", fntname);
		else fprintf(ofp, "~OL%-19.19s~RS", fntname);
		pc++;
		if (pc==4) {
			fprintf(ofp, "\n");
			pc=0;
			}
		if (user) write_user(user, ".");
		cnt++;
		}
	closedir(dirp);
	if (!cnt) fprintf(ofp, "Momentalne neni su ziadne obrazky\n");
	fprintf(ofp, "\n+----------------------------------------------------------------------------+\n\n");
	fclose(ofp);
	sprintf(fname, "%s/pictfiles.tmp", TEMPFILES);
	unlink(PICTLIST);
	rename(fname, PICTLIST);
	if (!user) printf(" spolu %d\n", cnt);
	else vwrite_user(user, " spolu %d\n", cnt);
}


void list_fnt_files(UR_OBJECT user)
{
	DIR *dirp;
	FILE *ofp;
	struct dirent *dp;
	char fname[FNAME_LEN];
	char name[ARR_SIZE];
	int cnt=0, pc;

	set_crash();
	if (!user) printf("Vytvaram zoznam fontov ... ");
	else write_user(user, "Vytvaram zoznam fontov ");

	if (!(dirp=opendir(FIGLET_FONTS))) {
		if (!user) {
			fprintf(stderr, "\nLotos: Directory open failure in list_fnt_files().\n");
			boot_exit(101);
			}
		else {
			write_user(user, "\nLotos: Directory open failure in list_fnt_files().\n");
			return;
			}
		}
	sprintf(fname, "%s/fntfiles.tmp", TEMPFILES);
	if ((ofp=fopen(fname, "w"))==NULL) {
		closedir(dirp);
		if (!user) {
			fprintf(stderr, "\nLotos: Nemozem vytvorit tempfajl v list_fnt_files().\n");
			boot_exit(102);
			}
		else {
			write_user(user, "\nLotos: Nemozem vytvorit tempfajl v list_fnt_files().\n");
			return;
			}
		}
	fprintf(ofp, "\n+----- ~FG~OLZoznam fontov~RS ------------------------------------------------------+\n\n");

	pc=0;
	while ((dp=readdir(dirp))!=NULL) {
		if (!strcmp(dp->d_name, ".")
		    || !strcmp(dp->d_name, "..")
		    || !strncmp(dp->d_name, ".flf", 4)
		    ) continue;
		strcpy(name, dp->d_name);
		name[strlen(name)-4]='\0';
		fprintf(ofp, "~OL%-19.19s~RS", name);
		pc++;
		if (pc==4) {
			fprintf(ofp, "\n");
			pc=0;
			}
		if (user) write_user(user, ".");
		cnt++;
		}
	(void) closedir(dirp);
	if (!cnt) fprintf(ofp, "Momentalne neni su ziadne fonty\n");
	fprintf(ofp, "\n+----------------------------------------------------------------------------+\n\n");
	fclose(ofp);
	sprintf(fname, "%s/fntfiles.tmp", TEMPFILES);
	unlink(FONTLIST);
	rename(fname, FONTLIST);
	if (!user) printf(" spolu %d\n", cnt);
	else vwrite_user(user, " spolu %d\n", cnt);
}


void list_kill_msgs(UR_OBJECT user)
{
	DIR *dirp;
	FILE *ifp, *ofp;
	struct dirent *dp;
	char fname[FNAME_LEN];
	char *pp, line[82];
	int cnt=0, pc;

	set_crash();
	if (!user) printf("Vytvaram zoznam 'kill hlasok' ... ");
	else write_user(user, "Vytvaram zoznam 'kill hlasok' ");

	if (!(dirp=opendir(KILLMSGS))) {
		if (!user) {
			fprintf(stderr, "\nLotos: Directory open failure in list_kill_msgs().\n");
			boot_exit(101);
			}
		else {
			write_user(user, "\nLotos: Directory open failure in list_kill_msgs().\n");
			return;
			}
		}
	sprintf(fname, "%s/killmsgs.tmp", TEMPFILES);
	if ((ofp=fopen(fname, "w"))==NULL) {
		closedir(dirp);
		if (!user) {
			fprintf(stderr, "\nLotos: Nemozem vytvorit tempfajl v list_kill_msgs().\n");
			boot_exit(102);
			}
		else {
			write_user(user, "\nLotos: Nemozem vytvorit tempfajl v list_kill_msgs().\n");
			return;
			}
		}
	fprintf(ofp, "\n+----- ~FG~OLZoznam kill hlasok~RS -------------------------------------------------+\n\n");

	pc=0;
	cnt=0;
	while ((dp=readdir(dirp))!=NULL) {
		if (!strcmp(dp->d_name, ".")
		    || !strcmp(dp->d_name, "..")
		    || strncmp(dp->d_name, "kill.", 5)
		    ) continue;
		sprintf(fname, "%s/%s", KILLMSGS, dp->d_name);
		if (!(ifp=fopen(fname, "r"))) continue;
		else {
			fgets(line, 81, ifp);
			pp=strchr(line, '\n');
			if (pp) pp[0]='\0';
			fclose(ifp);
			}
		pp=strchr(dp->d_name, '.');
		pc=atoi(++pp);
		fprintf(ofp, "%2d - %-75.75s\n", pc, line);
		if (pc>syspp->kill_msgs) syspp->kill_msgs=pc;
		if (user) write_user(user, ".");
		cnt++;
		}
	closedir(dirp);
	if (!cnt) fprintf(ofp, "Momentalne neni su ziadne 'kill hlasky'\n");
	fprintf(ofp, "\n+----------------------------------------------------------------------------+\n\n");
	fclose(ofp);
	sprintf(fname, "%s/killmsgs.tmp", TEMPFILES);
	unlink(KILLLIST);
	rename(fname, KILLLIST);
	if (!user) printf(" spolu %d\n", cnt);
	else vwrite_user(user, " spolu %d\n", cnt);
}

#endif /* __POC_ZOZ_C__ */