summaryrefslogblamecommitdiff
path: root/misc/src/txt-converter/login/login-converter.c
blob: c0055da19af8ff8b1387af1813db4b07806fa82d (plain) (tree)



























































































































































































































































                                                                                                                                                                                                                                                                                                            
// $Id: login-converter.c,v 1.1.1.1 2004/09/10 17:45:03 MagicalTux Exp $
// original : login2.c 2003/01/28 02:29:17 Rev.1.1.1.1
// login data file to mysql conversion utility.
//
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <arpa/inet.h>

#include <mysql.h>

#include "../../common/core.h"
#include "../../common/socket.h"
#include "../../login/login.h"
#include "../../common/mmo.h"
#include "../../common/version.h"
#include "../../common/db.h"

int account_id_count = START_ACCOUNT_NUM;
int server_num;
int new_account_flag = 0;
int login_port = 6900;

struct mmo_char_server server[MAX_SERVERS];
int server_fd[MAX_SERVERS];

#define AUTH_FIFO_SIZE 256
struct {
  int account_id,login_id1,login_id2;
  int sex,delflag;
} auth_fifo[AUTH_FIFO_SIZE];
int auth_fifo_pos=0;
struct {
	int account_id, sex;
	char userid[24], pass[24], lastlogin[24];
	int logincount;
	int state; // packet 0x006a value + 1 (0: compte OK)
	char email[40]; // e-mail (by default: a@a.com)
	char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a)
	time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban)
	time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited)
	char last_ip[16]; // save of last IP of connection
	char memo[255]; // a memo field
	int account_reg2_num;
	struct global_reg account_reg2[ACCOUNT_REG2_NUM];
} *auth_dat;
int auth_num=0,auth_max=0;

char login_account_id[256]="account_id";
char login_userid[256]="userid";
char login_user_pass[256]="user_pass";
char login_db[256]="login";

static struct dbt *gm_account_db;

int db_server_port = 3306;
char db_server_ip[16] = "127.0.0.1";
char db_server_id[32] = "ragnarok";
char db_server_pw[32] = "ragnarok";
char db_server_logindb[32] = "ragnarok";

int isGM(int account_id)
{
	struct gm_account *p;
	p = numdb_search(gm_account_db,account_id);
	if( p == NULL)
		return 0;
	return p->level;
}

int read_gm_account()
{
	char line[8192];
	struct gm_account *p;
	FILE *fp;
	int c=0;

	gm_account_db = numdb_init();
	printf("gm_account: read start\n");

	if( (fp=fopen("conf/GM_account.txt","r"))==NULL )
		return 1;
	while(fgets(line,sizeof(line),fp)){
		if(line[0] == '/' && line[1] == '/')
			continue;
		p=malloc(sizeof(struct gm_account));
		if(p==NULL){
			printf("gm_account: out of memory!\n");
			exit(0);
		}
		if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) {
			printf("gm_account: broken data [conf/GM_account.txt] line %d\n",c);
		}
		else {
			if(p->level > 99)
				p->level = 99;
			numdb_insert(gm_account_db,p->account_id,p);
		}
		c++;
	}
	fclose(fp);
	printf("gm_account: read done (%d gm account ID)\n",c);
	return 0;
}

int mmo_auth_init(void)
{
	MYSQL mysql_handle;
	char tmpsql[1024];
	MYSQL_RES* 	sql_res ;
	MYSQL_ROW	sql_row ;

	mysql_init(&mysql_handle);
	if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw,
		db_server_logindb ,db_server_port, (char *)NULL, 0)) {
			//pointer check
			printf("%s\n",mysql_error(&mysql_handle));
			exit(1);
	}
	else {
		printf ("connect success!\n");
	}
	printf ("convert start...\n");

	FILE *fp;
	int account_id, logincount, user_level, state, n, i;
	char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048];
	time_t ban_until_time;
	time_t connect_until_time;
	char t_uid[256];

	fp=fopen("save/account.txt","r");
	auth_dat=malloc(sizeof(auth_dat[0])*256);
	auth_max=256;
	if(fp==NULL)
		return 0;
	while(fgets(line,1023,fp)!=NULL){

		if(line[0]=='/' && line[1]=='/')
			continue;

		i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t"
		                 "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n",
		    &account_id, userid, pass, lastlogin, &sex, &logincount, &state,
		    email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n);

		sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`"
                    " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, login_user_pass, login_db, login_userid, t_uid);

		if(mysql_query(&mysql_handle, tmpsql) ) {
			printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
		}
		user_level = isGM(account_id);
		printf ("userlevel: %s (%d)- %d\n",userid, account_id, user_level);
		sql_res = mysql_store_result(&mysql_handle) ;
		sql_row = mysql_fetch_row(sql_res);	//row fetching
		if (!sql_row) //no row -> insert
			sprintf(tmpsql, "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);",account_id , userid, pass,lastlogin,sex,logincount, user_level);
		else //row reside -> updating
			sprintf(tmpsql, "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';",account_id , userid, pass,lastlogin,sex,logincount, user_level, account_id);
		printf ("Query: %s\n",tmpsql);
		mysql_free_result(sql_res) ; //resource free
		if(mysql_query(&mysql_handle, tmpsql) ) {
			printf("DB server Error - %s\n", mysql_error(&mysql_handle) );
		}
	}
	fclose(fp);

	printf ("convert end...\n");

	return 0;
}

// �A�J�E���g�f??�x?�X�̏�������
void nowork(void)
{
	//null
}

int login_config_read(const char *cfgName){
	int i;
	char line[1024], w1[1024], w2[1024];
	FILE *fp;

	fp=fopen(cfgName,"r");

	if(fp==NULL){
		printf("file not found: %s\n", cfgName);
		return 1;
	}
	printf ("start reading configuration...\n");
	while(fgets(line, 1020, fp)){
		if(line[0] == '/' && line[1] == '/')
			continue;

		i=sscanf(line,"%[^:]:%s", w1, w2);
		if(i!=2)
			continue;


		//add for DB connection
		if(strcmpi(w1,"db_server_ip")==0){
			strcpy(db_server_ip, w2);
			printf ("set db_server_ip : %s\n",w2);
		}
		else if(strcmpi(w1,"db_server_port")==0){
			db_server_port=atoi(w2);
			printf ("set db_server_port : %s\n",w2);
		}
		else if(strcmpi(w1,"db_server_id")==0){
			strcpy(db_server_id, w2);
			printf ("set db_server_id : %s\n",w2);
		}
		else if(strcmpi(w1,"db_server_pw")==0){
			strcpy(db_server_pw, w2);
			printf ("set db_server_pw : %s\n",w2);
		}
		else if(strcmpi(w1,"db_server_logindb")==0){
			strcpy(db_server_logindb, w2);
			printf ("set db_server_logindb : %s\n",w2);
		}
	}
	fclose(fp);
	printf ("End reading configuration...\n");
	return 0;
}

int do_init(int argc,char **argv)
{
	char input;
	login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME );
	read_gm_account();

        printf("\nWarning : Make sure you backup your databases before continuing!\n");
        printf("\nDo you wish to convert your Login Database to SQL? (y/n) : ");
        input=getchar();
	if(input == 'y' || input == 'Y')
		mmo_auth_init();

	exit(0);
}