Файл: pages/account/mail.php
Строк: 478
<?php
// Physical module map v50.6: public URL stays clean while code lives in /pages.
if (!defined('GAME_ROOT')) define('GAME_ROOT', dirname(__DIR__, 2));
chdir(GAME_ROOT);
if (PHP_SAPI !== 'cli') { $_SERVER['PHP_SELF']='/mail.php'; $_SERVER['SCRIPT_NAME']='/mail.php'; }
/* Обновление игры под PHP 8.4 / PDO и усиление безопасности: by Метриум (Стэлп) */
include './system/common.php';
include './system/functions.php';
include './system/user.php';
if(!$user) {
header('location: /');
exit;
}
$id = (int)_num(($_GET['id'] ?? 0));
$isSystem = ($id === 2);
?>
<div class='main'>
<?php
if($id) {
if($isSystem) {
// Виртуальная Система: отдельный персонаж в users не требуется.
$ho = ['id'=>2,'login'=>'Система','level'=>0,'r'=>'bot','online'=>time(),'access'=>0,'mailclosed'=>1];
} else {
$ho = db_fetch_array(db_query('SELECT * FROM `users` WHERE `id`='.(int)$id.' LIMIT 1'));
}
if(!$isSystem && (!$id || !$ho || $id == (int)$user['id'])) {
header('location: /mail/');
exit;
}
$title = $isSystem ? 'Система' : 'Диалог с '.$ho['login'];
include './system/h.php';
if($isSystem){ db_query('UPDATE `mail` SET `read`=1 WHERE `to`='.(int)$user['id'].' AND `from` IN (0,2)'); } else { db_query('UPDATE `mail` SET `read`=1 WHERE `to`='.(int)$user['id'].' AND `from`='.(int)$ho['id']); }
echo '<div class="main">';
?>
<?php
if(isset($_SESSION['chok'])){
echo smiles($_SESSION['chok']);
unset($_SESSION['chok']);
}
if(isset($_SESSION['choke'])){
echo smiles($_SESSION['choke']);
unset($_SESSION['choke']);
}
if(isset($_SESSION['chok2'])){
echo smiles($_SESSION['chok2']);
unset($_SESSION['chok2']);
}
if(isset($_SESSION['choke2'])){
echo smiles($_SESSION['choke2']);
unset($_SESSION['choke2']);
}
?>
<?php
if($isSystem) {
echo "<center><font color='orange'>Система</font><img src='/images/smiles/mini_ulibka.gif'></center>";
}
?>
<div class='menuList'><li><a href='/mail/'><img src='/images/icon/arrow.png' alt=''/>Назад в почту</a></li></div><div class='mini-line'></div>
<?php
if(db_result(db_query('SELECT COUNT(*) FROM `contacts` WHERE `user` = ''.$user['id'].'' AND `ho` = ''.$ho['id'].'''),0) == 0) {
db_query('INSERT INTO `contacts` (`user`,
`ho`,
`time`) VALUES (''.$user['id'].'',
''.$ho['id'].'',
''.time().'')');
}
if(db_result(db_query('SELECT COUNT(*) FROM `contacts` WHERE `ho` = "'.$user['id'].'" AND `user` = "'.$ho['id'].'"'),0) == 0) {
db_query('INSERT INTO `contacts` (`ho`,
`user`,
`time`) VALUES (''.$user['id'].'',
''.$ho['id'].'',
''.time().'')');
}
if(!$isSystem && (int)($ho['mailclosed'] ?? 0)===1) {
echo "<center><font color='lime'>Почта {$ho['login']} закрыта</font></center>";
}
if((int)$user['level']<19) {
echo "<center>Почта доступна с 20 уровня</center>";
}
if($user['maill']==1) {
echo "<center><font color='lime'>Вы забанены в почте</font></center>";
}
if($ho['r'] != $user['r']) $_s = 100; else $_s = 1;
$text = _string(($_POST['text'] ?? ''));
if(db_result(db_query('SELECT COUNT(*) FROM `blacklist` WHERE `user2` = ''.$user['id'].'' AND `user` = ''.$ho['id'].'''),0) != 0){
echo'<center>Вы в черном списке '.$ho['login'].'</center>';
}else{
if($text && !$isSystem) {
$antiflood = db_fetch_array(db_query('SELECT * FROM `mail` WHERE `from` = ''.$user['id'].'' ORDER BY `time` DESC LIMIT 1'));
if($antiflood && time() - (int)($antiflood['time'] ?? 0) < 10) $errors[] = 'Писать можно 1 раз в 10 секунд';
if($user['s'] < $_s) $errors[] = 'Не хватает <img src='/images/icon/silver.png' alt='*'/> '.($_s - $user['s']).' серебра<div class='separ'></div><a href='/trade/'>Купить</a>';
if($errors) {
echo '<div class='block' align='center'>';
foreach($errors as $error) {
echo $error.'<br/>';
}
echo '</div>
<div class='mini-line'></div>';
}
else
{
$text = preg_replace('~[a-z][a-z0-9+.-]*://[^<>s]+~iu', '*', $text) ?? $text;
$arrReplace = array('.ru',
'.net',
'.com',
'.рф',
'.tk',
'ref=',
'.su',
'.us',
'.mobi',
'.X-com',
'.ua',
'.keo.su',
'.ру',
'aux.su',
'. r u',
'.доброзло.де',
'.доброзло. де',
'.доброзло.д е',
'.д оброзло.де',
'.д о брозло.де',
'.д о б р о з л о.де',
'.доброз ло.д е',
'.д обр озло.де',
'.до брозл о.де',
'vtutage',
'vipgame',
'.ru',
'. tk',
'. t k',
'wart',
'.Ru',
'.r U',
'.ру',
'.RU',
'.RLDOFDA',
'ДОБРО ПРОТИВ',
'доброзло',
'до бр оз ло',
'доброзло.де',
' ЗЛО',
'.mir',
'.de',
'dobrozlo',
'.tk',
'. t k',
'.t-k',
'do br oz lo',
'dob',
'.d e',
'.d e',
'.r',
'.zzz.com.ua',
'.net',
'.pro',
'pro',
'pr o',
'http');
$size = count($arrReplace);
while($size--)
{
if(substr_count($text, $arrReplace[$size]))
{
db_query("INSERT INTO `mail` SET `from`='0',`to`='1',`text`=' Пользователь ".$user['login']." | ID: ".$user['id']." нарушает правила игры! Сообщение: ".$text."',`time`='".time()."'");
db_query("INSERT INTO `ban` SET `user`='".$user['id']."',`time`='2147483647',`text`='Нарушение правил игры!',`who`='Система', `ip`='".$user['ip']."'");
break;
}
}
$text = str_replace($arrReplace, '*', $text);
db_query('UPDATE `users` SET `s` = `s` - '.$_s.' WHERE `id` = ''.$user['id'].''');
db_query('INSERT INTO `mail` (`from`,
`to`,
`text`,
`time`) VALUES (''.$user['id'].'',
''.$ho['id'].'',
''.$text.'',
''.time().'')');
db_query('UPDATE `contacts` SET `time` = ''.time().'' WHERE `user` = ''.$user['id'].'' AND `ho` = ''.$ho['id'].''');
db_query('UPDATE `contacts` SET `time` = ''.time().'' WHERE `ho` = ''.$user['id'].'' AND `user` = ''.$ho['id'].''');
header('location: /mail/'.$ho['id'].'/');
}
}
if(($_GET['the'] ?? '')=='act') {
db_query("INSERT INTO `blacklist` (`user`,`user2`)VALUES('{$user['id']}','{$ho['id']}')");
$_SESSION['chok'] = '<center> <font color="green"><img src="/images/icon/ok.png"> ('.$ho['login'].')
добавлен в ваш чёрный список </center>';
header('location:?');
}
if(($_GET['the'] ?? '')=='act3') {
db_query("INSERT INTO `friends` (`user`,`user2`)VALUES('{$user['id']}','{$ho['id']}')");
$_SESSION['chok2'] = '<center> <font color="lime"><img src="/images/icon/ok.png"> ('.$ho['login'].')
добавлен в список друзей </center>';
header('location:?');
}
if(($_GET['the'] ?? '')=='act2') {
db_query("DELETE FROM `blacklist` WHERE `user2` = ".$ho['id']."");
$_SESSION['choke'] = '<center><font color="green"><img src="/images/icon/ok.png"> ('.$ho['login'].') Удален с вашего чёрного списка</font></center>';
header('location:?');
}
if(($_GET['the'] ?? '')=='act4') {
db_query("DELETE FROM `friends` WHERE `user2` = ".$ho['id']."");
$_SESSION['choke2'] = '<center> <font color="lime"><img src="/images/icon/ok.png"> ('.$ho['login'].')
Удален с списка друзей</center>';
header('location:?');
}
if($ho['id'] != 2){
if($user['id'] !=9930) {
if((int)($ho['mailclosed'] ?? 0) !== 1) {
if($user['maill']==0) {
if($user['level']>19) {
// by Метриум (Стэлп)
?>
<style>
.message_usr{
position:relative;
white-space:nowrap;
padding:6px 2px 6px 12px;
font:normal 16px arial,sans-serif;
overflow:hidden;
}
.yea_from{
color:#888;
font-size:12px;
padding-bottom:3px;
text-shadow:rgba(255,255,255,0.2) 0 0 12px;
transition:opacity 300ms;
-moz-transition:opacity 300ms;
-o-transition:opacity 300ms;
-webkit-transition:opacity 300ms;
}
.yea_from span{
display:block;
display:inline-block;
overflow:hidden;
text-overflow:ellipsis;
width:100%;
}
.user_avatar2{
-ms-box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
box-sizing:border-box;
background-repeat:no-repeat;
background-size:cover;
background-position:0 0;
overflow:hidden;
}
.user_avatar{
vertical-align:top;
position:static;
margin-right:12px;
width:36px;
height:36px;
min-width:36px;
min-height:36px;
border-radius:18px;
display:none;
}
.block_avatar{
display:-moz-inline-box;
-moz-box-orient:vertical;
display:inline-block;
vertical-align:middle;
}
.message_text_v3{
max-width:70%;
display:-moz-inline-box;
-moz-box-orient:vertical;
display:inline-block;
vertical-align:middle;
vertical-align:top;
text-align:left;
position:relative;
margin-right:103px;
margin-left:12px;
white-space:normal;
background-color:#3a3535;
border-radius:5px;
word-break:break-word;
-ms-box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
box-sizing:border-box;
box-shadow:0 0 10px -1px rgba(24,24,24,0.14);
-webkit-box-shadow: 0 0 10px -1px rgba(24,24,24,0.14);
}
@media screen and (max-width: 1349px) and (min-device-width: 800px) and (min-width: 500px){
.message_text_v3{
max-width:80%;
}}
.message_text_v3{
margin-left:0;
}
.message_text_v3block{
word-wrap:break-word;
padding:9px 0 12px 14px;
display:inline-block;
-ms-box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
box-sizing:border-box;
width: 100%;
}
.message_text_v3block{
padding-right:10px;
}
.message_dates{
color:#888;
font-size:12px;
position:absolute;
top:0;
right:auto;
bottom:auto;
left:100%;
white-space:nowrap;
padding:12px 7px;
}
.message_date_status{
display:none;
width:25px;
height:12px;
background-image:none;
background-position:100px 100px;
background-repeat:no-repeat;
background-attachment:scroll;
background-size:35px 5000px;
}
.message_date_time{
text-shadow:rgba(255,255,255,0.2) 0 0 12px;
transition:opacity 300ms;
-moz-transition:opacity 300ms;
-o-transition:opacity 300ms;
-webkit-transition:opacity 300ms;
}
.message_me_self{
text-align:right;
}
.message_me_from{
display:none;
}
.message_text_v2{
max-width:70%;
display:-moz-inline-box;
-moz-box-orient:vertical;
display:inline-block;
vertical-align:middle;
vertical-align:top;
text-align:left;
position:relative;
margin-right:103px;
margin-left:12px;
white-space:normal;
background-color:#3a3535;
border-radius:5px;
word-break:break-word;
-ms-box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
box-sizing:border-box;
box-shadow:0 0 10px -1px rgba(24,24,24,0.14);
-webkit-box-shadow: 0 0 10px -1px rgba(24,24,24,0.14);
}
@media screen and (max-width: 1349px) and (min-device-width: 800px) and (min-width: 500px){
.message_text_v2{
max-width:80%;
}}
.message_text_v2{
margin-right:0;
margin-left:65px;
background-color:rgba(220, 248, 198, 0.4);
}
.message_text_v2{
margin-left:65px;
}
.messages_date{
left:auto;
right:100%;
}
.button {
color:#666;
padding: 7px;
}
.button3 {
background-image:url(/images/smiles/blum.gif);
background-color: #666;
background-position:center;
background-repeat:no-repeat;
border-bottom:2px solid #330066;
border-left:2px solid #330066;
border-radius:50px;
border-right:2px solid #330066;
border-top:2px solid #330066;
width:35px;
height:35px;
}
.button4 {
background-image: url(/images/smiles/bwink.gif);
background-color: #666;
background-position: center;
background-repeat: no-repeat;
border-bottom: 2px solid #330066;
border-left: 2px solid #330066;
border-radius: 50px;
border-right: 2px solid #330066;
border-top: 2px solid #330066;
width: 35px;
height: 35px;
}
</style>
<script>
function showContent(link) {
var cont = document.getElementById('contentBody');
var loading = document.getElementById('loading');
cont.innerHTML = loading.innerHTML;
var http = createRequestObject();
if( http ) {
http.open('get', link);
http.onreadystatechange = function () {
if(http.readyState == 4) {
cont.innerHTML = http.responseText;
}
}
http.send(null);
} else {
document.location = link;
}
}
function createRequestObject() {
try { return new XMLHttpRequest() }
catch(e) {
try { return new ActiveXObject('Msxml2.XMLHTTP') }
catch(e) {
try { return new ActiveXObject('Microsoft.XMLHTTP') }
catch(e) { return null; }
}
}
}
</script>
<div class='block_zero'>
<form action='/mail/<?=$ho['id'];?>' method='post'>
<center> <input type="button" class="button3" onClick="showContent('/chat/page1.html')" value="">
<input type="button" class="button4" onClick="showContent('/chat/page2.html')" value=""/></center>
Сообщение:<br/><input id='sml' name='text' style='width: 90%;' heidth=2px; class='text'></a></a> </a><br/>
<span class='btn'><span class='end'><input class='label' type='submit'>Отправить</span></span>
</form>
<script type='text/javascript'>
/*<![CDATA[*/
function sml(id, html) {
var e = document.getElementById(id);
if (e != null) {
e.value += ' ' + html + ' ';
e.focus();
}
}
/*]]>*/
</script>
<?php
echo "<div id='contentBody'>";
echo "</div>";
echo '<div id="loading" style="display: none">';
echo "Идет загрузка...";
echo "</div>";
?>
<?php
echo' <center><font color='#909090'><small><small>Стоимость сообщения '.($user['r'] == $ho['r'] ? 'своей':'чужой').' фракции <img src='/images/icon/silver.png' alt='*'/> '.$_s.'</font></small></small></font></center>
</div></div>
<div class='mini-line'></div>';
}
}
}
}
}
}
$max = 10;
if($isSystem) $count=(int)db_result(db_query('SELECT COUNT(*) FROM `mail` WHERE (`to`='.(int)$user['id'].' AND `from` IN (0,2)) OR (`from`='.(int)$user['id'].' AND `to` IN (0,2))'),0); else $count=(int)db_result(db_query('SELECT COUNT(*) FROM `mail` WHERE (`from`='.(int)$user['id'].' AND `to`='.(int)$ho['id'].') OR (`to`='.(int)$user['id'].' AND `from`='.(int)$ho['id'].')'),0);
$pages = ceil($count/$max);
$page = _string(_num(($_GET['page'] ?? 1)));
if($page > $pages) $page = $pages;
if($page < 1) $page = 1;
$start = $page * $max - $max;
if($count > 0) {
$col = array('#ffffff', '#f09060', '#90c0c0');
$uidMail=(int)$user['id'];
if($isSystem){
$q=db_query('SELECT * FROM `mail` WHERE ((`to`='.$uidMail.' AND `from` IN (0,2)) OR (`from`='.$uidMail.' AND `to` IN (0,2))) ORDER BY `time` DESC LIMIT '.(int)$start.','.(int)$max);
} else {
$hidMail=(int)$ho['id'];
$q=db_query('SELECT * FROM `mail` WHERE ((`from`='.$uidMail.' AND `to`='.$hidMail.') OR (`to`='.$uidMail.' AND `from`='.$hidMail.')) ORDER BY `time` DESC LIMIT '.(int)$start.','.(int)$max);
}
echo'';
while($row = db_fetch_array($q)) {
$from = in_array((int)$row['from'],[0,2],true) ? ['id'=>2,'login'=>'Система','r'=>'bot','online'=>time(),'access'=>0] : db_fetch_array(db_query('SELECT * FROM `users` WHERE `id`='.(int)$row['from'].' LIMIT 1'));
echo '<div class='block_zero'><span style='float: right; color: '.(($row['read'] == 0) ? '#90c090':'#909090').';'>'.date('d.m | H:i', $row['time']).'</span></span>'.($from['id'] != 2 ? '<img src='/images/icon/race/'.$from['r'].($from['online'] > time() - 300 ? '':'-off').'.png' alt='*'/> <a href='/user/'.$from['id'].'/'>'.$from['login'].'</a><br/>':'<img src='/images/icon/race/bot.png' alt="*"/> Система<br/>').''.($from['id'] != 2 ? '<font color=''.$col[$from['access']].''>'.smiles(security_html($row['text'])).'</font>' : '<font color=#9DC8E7>'.game_system_text(smiles((string)$row['text']))).'</font></div><div class='dot-line'></div>';
if($row['to'] == $user['id'] && $row['read'] == 0) db_query('UPDATE `mail` SET `read` = '1' WHERE `id` = ''.$row['id'].''');
}
echo '<div class='block_zero'>'.pages('/mail/'.$id.'/?').'</div>';
}
else
{
echo '<div class='block_zero'><font color='#909090'>Сообщений нет</font></div>';
}
?>
<div class='mini-line'></div><div class='menuList'><li><a href='/forum/topic/525/'><img src='/images/icon/forum.png' alt=''/>Важно! Безопасность персонажа</a></li></div>
</div><?php if(!$isSystem): ?><center>
<?php
if(db_result(db_query('SELECT COUNT(*) FROM `blacklist` WHERE `user` = ''.$user['id'].'' AND `user2` = ''.$ho['id'].'''),0) == 0){
?>
<a class="btn" href="?the=act"><span class="end"><span class="label">В черный список</span></span></a>
<?php
}else{
echo "<a class='btn' href='?the=act2'><span class='end'><span class='label'>Убрать с игнора</span></span></a>";
}
?>
<?php
if(db_result(db_query('SELECT COUNT(*) FROM `friends` WHERE `user` = ''.$user['id'].'' AND `user2` = ''.$ho['id'].'''),0) == 0){
?>
<a class="btn" href="?the=act3"><span class="end"><span class="label">В друзья</span></span></a>
<?php
}else{
echo "<a class='btn' href='?the=act4'><span class='end'><span class='label'>Убрать с друзей</span></span></a>";
}
?></center><?php endif; ?>
<?php
include './system/f.php';
}
else
{
$title='Почта';
include './system/h.php';
$uid=(int)$user['id'];
echo '<div class="main mail-ref">';
$sysCount=(int)db_result(db_query('SELECT COUNT(*) FROM `mail` WHERE `to`='.$uid.' AND `from` IN (0,2)'),0);
if($sysCount){
$sysNew=(int)db_result(db_query('SELECT COUNT(*) FROM `mail` WHERE `to`='.$uid.' AND `from` IN (0,2) AND `read`=0'),0);
$last=db_fetch_array(db_query('SELECT `text` FROM `mail` WHERE `to`='.$uid.' AND `from` IN (0,2) ORDER BY `time` DESC,`id` DESC LIMIT 1'));
echo '<a class="mail-row mail-system" href="/mail/system/"><img src="/images/icon/race/bot.png" alt=""/> Система'.($sysNew?'<b class="mail-new">+'.$sysNew.'</b>':'').'<span class="mail-preview">'.htmlspecialchars(mb_substr((string)($last['text']??''),0,38,'UTF-8'),ENT_QUOTES,'UTF-8').(mb_strlen((string)($last['text']??''),'UTF-8')>38?'...':'').'</span></a>';
}
$threads=db_query('SELECT CASE WHEN `from`='.$uid.' THEN `to` ELSE `from` END peer,MAX(`time`) last_time FROM `mail` WHERE (`from`='.$uid.' OR `to`='.$uid.') AND `from` NOT IN(0,2) AND `to` NOT IN(0,2) GROUP BY peer ORDER BY MAX(CASE WHEN `to`='.$uid.' AND `read`=0 THEN 1 ELSE 0 END) DESC,last_time DESC LIMIT 100');
while($r=db_fetch_array($threads)){
$peer=(int)($r['peer']??0); if($peer<=0||$peer===$uid) continue;
$ho=db_fetch_array(db_query('SELECT `id`,`login`,`level`,`r`,`online` FROM `users` WHERE `id`='.$peer.' LIMIT 1')); if(!$ho) continue;
$new=(int)db_result(db_query('SELECT COUNT(*) FROM `mail` WHERE `from`='.$peer.' AND `to`='.$uid.' AND `read`=0'),0);
$last=db_fetch_array(db_query('SELECT `text` FROM `mail` WHERE ((`from`='.$uid.' AND `to`='.$peer.') OR (`from`='.$peer.' AND `to`='.$uid.')) ORDER BY `time` DESC,`id` DESC LIMIT 1'));
echo '<a class="mail-row" href="/mail/'.$peer.'/"><img src="/images/icon/race/'.(int)$ho['r'].(((int)$ho['online']>time()-300)?'':'-off').'.png" alt=""/> '.htmlspecialchars((string)$ho['login'],ENT_QUOTES,'UTF-8').', '.(int)$ho['level'].' ур.'.($new?'<b class="mail-new">+'.$new.'</b>':'').'<span class="mail-preview">'.htmlspecialchars(mb_substr((string)($last['text']??''),0,38,'UTF-8'),ENT_QUOTES,'UTF-8').(mb_strlen((string)($last['text']??''),'UTF-8')>38?'...':'').'</span></a>';
}
echo '<div class="mail-section">› <a href="/gifts/'.$uid.'/">Мои подарки</a></div><div class="mail-section">★ <a href="/mail/friends">Друзья</a> | <a href="/mail/blacklist">Чёрный список</a></div></div>';
include './system/f.php';
}
?>