Просмотр файла game/1/datafunc.php

Размер файла: 9.22Kb
<?

$gamedays = 27;  // Оплачиваемый период
$freedays = 3000; // Бесплатно дней можно играть

/*

Blade: 01.06.2004: В функцию SetData() и checkpass() внесены изменения, позволяющие записывать игровые данные без пароля (чтобы убрать возможность клонирования вещей)
Blade: 16.09.2004: скопировал сюда функцию SetPartner()
Blade: 18.01.2005: изменил GetData() с учетом сервера
Blade: 20.04.2005: ввел проверку на вход только с одного сервера
Blade: 21.04.2005: убрал проверки, т.к. изменил f_connect.php

Добавились 2 функции и 2 переменные (см.выше)

function GetGameTime($login, $pass, &$time)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
  //Возвращает время (в $time) окончания оплаченного периода или 0 - если оплаты не было

function SetGameTime($login, $pass, $time)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
  // Запрещает устанавливать $time > (time() + ($gamedays+$freedays)*24*3600)
*/

/*
3 функции: SetData, GetData, SetUser

function SetData($login,$pass,$data)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.

function GetData($login,$pass,&$data)
{ // Возвращает пустую строку в случае успеха (данные возвращаются в $data) или сообщение об ошибке.

function SetUser($login,$oldpass,$newpass)
{//  Регистрация нового пользователя (oldpass = "") или смена пароля.
 // Возвращает пустую строку в случае успеха или сообщение об ошибке.

При авторизации login и pass - не более 10 символов, а также огрничения в синтаксисе (только
латинские буквы и знак подчёркивания)
При обращении к функциям авторизации стоит 30-секундная защита от подбора пароля.

*/

$NOT_SET = "NOT_SET";
require("items/i.w.s.steel.ssp"); // Настройки БД
//require($GLOBALS["DOCUMENT_ROOT"]."/antimat.ssp"); // Антимат-фильтр ( чтобы ники матерные не регистрировали)


function ValidNN($s)
{
  return !eregi("[^a-z0-9_]",$s);
}

function ValidPass($s)
{
  return !eregi("[^a-z0-9]",$s);
}

function InitParam($N,$V)
{
global $Names,$Values;
  $Names = $N;
  $Values = $V;
}

function GetParam($Name)
{
global $Names,$Values,$NOT_SET;
  $Name = strtolower($Name);
  $Nlist = split(":",$Names);
  for ($i=0; $i<count($Nlist); $i++) if ($Nlist[$i] == $Name) break;
  if ($i == count($Nlist)) return $NOT_SET;
  $Vlist = split(":",$Values);
  return stripslashes(str_replace("!~!",":",$Vlist[$i]));
}


function SetParam($Name,$Value)
{
global $Names,$Values,$NOT_SET;
  $Nlist = split(":",$Names);
  $Name = strtolower($Name);
  $Value = addslashes(str_replace(":","!~!",$Value));
  for ($i=0; $i<count($Nlist); $i++) if ($Nlist[$i] == $Name) break;

  if ($i == count($Nlist) and ($Value != $NOT_SET))
  { // Добавляем имя и значение
    $Names .= ":$Name";
    $Values .= ":$Value";
  }
  else
  {
    $Vlist = split(":",$Values);
    $Vlist[$i] = $Value;
    $Values = implode(":",$Vlist);
    if ($Value == $NOT_SET)
    { // Удаление имени и значения
      $Nlist[$i] = $NOT_SET;
      $Names = implode(":",$Nlist);
      $Names = str_replace(":$NOT_SET","",$Names);
      $Values = str_replace(":$NOT_SET","",$Values);
    }
  }
}


function checkpass($nick, $pass, $fields, &$result,$skippass=0)
{ //
global $PassDelay;
  if ($fields == "") $fields = "pass,lastrefr";
  else if ($fields !== "*") $fields .= ",pass,lastrefr";

  $now = time();
  $sql="select $fields from users where nick='$nick'";
  $result=mysql_query($sql) or die(mysql_error());
  if (mysql_num_rows($result)!=1) return "Логин не найден";

  $row = mysql_fetch_array($result);
  $dt = $PassDelay - $now + $row['lastrefr'];
  if ($dt > 0) return "Повторите через $dt"."sec";

  if ($row['pass']!=$pass && !$skippass)
  {
    $sql = "update users set lastrefr=$now where nick='$nick'";
    mysql_query($sql) or die(mysql_error());
    return "Неверный пароль";
  }
  return "";
}

function openDB()
{
global $server,$user,$dbpass,$dbname;
  $sesDB = @mysql_connect($server,$user,$dbpass);
mysql_query("SET NAMES 'cp1251'"); 
mysql_query("SET CHARACTER SET 'cp1251'"); 
mysql_query("SET collation_connection=cp1251_general_ci"); 
mysql_query("SET character_set_results=cp1251"); 
mysql_query("SET character_set_client=cp1251"); 
mysql_query("SET collation_database=cp1251_general_ci");
  if (!$sesDB) return "База данных недоступна. Повторите через 5мин";
  $ok = @mysql_select_db($dbname,$sesDB);
  if (!$ok)return "База данных недоступна. Повторите через 5мин";
  return "";
}

function SetData($login,$pass,$data)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
global $error, $Names, $Values;
  if (empty($login)) return "Логин не задан";
  if (empty($pass)) return "Пароль не задан";

  $maxdata = 5000; // Максимальная длина данных
  if(strlen($data)>$maxdata) return "Слишком длинная строка.";

  $error =openDB();
  if ($error != "") return $error;

  $ok = checkpass($login,$pass,"names,vals",$result,1);        // сохраняет без пароля!
  if ($ok != "") return $ok;
  InitParam(mysql_result($result,0, "names"),mysql_result($result,0, "vals"));

  SetParam('gamedata',$data);

  $sqlUpd = "update users set names='$Names', vals='$Values' where nick = '$login'";
  mysql_query($sqlUpd) or die(mysql_error());
  mysql_close();
}

function GetData($login,$pass,&$data,$srv=0)
{ // Возвращает пустую строку в случае успеха (данные возвращаются в $data) или сообщение об ошибке.
global $error, $Names, $Values, $NOT_SET;
  if (empty($login)) return "Логин не задан";
  if (empty($pass)) return "Пароль не задан";


  $error =openDB();
  if ($error != "") return $error;

  $ok = checkpass($login,$pass,"names,vals",$result);
  if ($ok != "") return $ok;
  InitParam(mysql_result($result,0, "names"),mysql_result($result,0, "vals"));
  mysql_close();
  $data = GetParam("gamedata");
  if ($data == $NOT_SET) return "Данные не найдены";

/*
  // проверим сервер
  if ($srv>0) {
        $tus=unserialize($data);
        if (gettype($tus)!="array") return "";
        if ($tus["srv"]>0 && $srv!=$tus["srv"]) return "Чтобы играть на сервере ".$srv.", вначале зайдите на сервер ".$tus["srv"]." и сохранитесь на нем (персонаж должен покинуть игру), либо выберите Опции аккаунта и Сменить сервер.";
        }
*/
  return "";
}

function SetUser($login,$oldpass,$newpass)
{ // Регистрация нового пользователя (oldpass = "") или смена пароля.
  // Возвращает пустую строку в случае успеха или сообщение об ошибке.
global $RegStatus,$DefRefrInt,$DefMessLim,$CommonMode;

  if (empty($login)) return "Логин не задан";
  if (empty($newpass)) return "Пароль не задан";
  if (!ValidNN($login)) return "Неверный синтаксис в логине";
  if (!ValidPass($newpass)) return "Неверный синтаксис в пароле";

  $login=substr($login,0,10);
  $newpass=substr($newpass,0,10);

  $BadWord = GetBadWord($login);
  if ($BadWord != "") return "Логин содержит запрещённое слово";

  $error =openDB();
  if ($error != "") return $error;

  if ($oldpass !="")
  {
    $ok = checkpass($login,$oldpass,"",$result);
    if ($ok != "") return $ok;
    $sqlUpd = "update users set pass='$newpass' where nick = '$login' and pass='$oldpass'";
    mysql_query($sqlUpd) or die(mysql_error());
  }
  else
  {
    $sqlSel="select * from users where nick = '$login'";
    $result=mysql_query($sqlSel) or die(mysql_error());
    $Count=mysql_num_rows($result);
    if ($Count != 0) return "Такой логин уже зарегистирован";
    $now = time();
    $sqllogin ="insert into users (status,sent,regtime,refrint,messlim,mode,nick,pass) values ('$RegStatus','0', '$now', '$DefRefrInt','$DefMessLim', '$CommonMode','$login', '$newpass')";
    mysql_query($sqllogin) or die(mysql_error());
  }
  mysql_close();
  return "";
}

function GetGameTime($login, $pass, &$time)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
  //Возвращает время (в $time) окончания оплаченного периода или 0 - если оплаты не было
global $error;
  if (empty($login)) return "Логин не задан";
  if (empty($pass)) return "Пароль не задан";

  openDB();
  if ($error != "") return $error;

  $ok = checkpass($login,$pass,"gametime",$result);
  if ($ok != "") return $ok;
  $time = mysql_result($result,0, "gametime");
  mysql_close();
  return "";
}

function SetGameTime($login, $pass, $time)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
  // Запрещает устанавливать $time > (time() + ($gamedays+$freedays)*24*3600)
global $error, $gamedays, $freedays;
  if (empty($login)) return "Логин не задан";
  if (empty($pass)) return "Пароль не задан";

  openDB();
  if ($error != "") return $error;

  $ok = checkpass($login,$pass,"",$result);
  if ($ok != "") return $ok;

  if ($time > (time() + ($gamedays+$freedays)*24*3600)) return "Период оплаты превышает ".($gamedays+$freedays)." дней";
  $sqlUpd = "update users set gametime='$time' where nick = '$login' and pass='$pass'";
  mysql_query($sqlUpd) or die(mysql_error());
  mysql_close();
  return "";
}



function SetPartner($login, $pi)
{ // Возвращает пустую строку в случае успеха или сообщение об ошибке.
  // Фиксирует партнёра для ника (login)
  // Внимание - не проводится проверка на наличие login-а
global $error;
  openDB();
  if ($error != "") return $error;
  $sqlUpd = "update users set pi='$pi' where nick = '$login'";
  mysql_query($sqlUpd) or die(mysql_error());

  $now = time();
  $sqlIns ="insert into partners (time,nick,pi) values ('$now','$login','$pi')";
  mysql_query($sqlIns) or die(mysql_error());
  mysql_close();
  return "";
}



?>