Файл: sys/inc/classes/class.Diary.php
Строк: 330
<?php 
class Diary
{
    /**
     *
     * @param int $num
     * @param string $one
     * @param string $two
     * @param string $more
     * @return string
     */
    static function number($num, $one, $two, $more)
    {
        $num = (int)$num;
        $l2 = substr($num, is_strlen($num) - 2, 2);
        if ($l2 >= 5 && $l2 <= 20)
            return $more;
        $l = substr($num, is_strlen($num) - 1, 1);
        switch ($l) {
            case 1:
                return $one;
                break;
            case 2:
                return $two;
                break;
            case 3:
                return $two;
                break;
            case 4:
                return $two;
                break;
            default:
                return $more;
                break;
        }
    }
    
    /**
     * читабельное представление времени с учетом часового пояса пользователя
     * @global user $user
     * @param int $time Время в формате timestamp
     * @param boolean $adaptive Адаптивное представлени (вместо полной даты использовать "сегодня", "вчера")
     * @return string
     */
    public static function vremja($time, $adaptive = true) {
        if (!$time) {
            $time = time();
        }
        
        $realTime = time();
        
        if ($time > $realTime) {
            $time -= $realTime;
            $mes = 0;
            $day = 0;
            $hour = 0;
            $min = 0;
            $sec = 0;
            if ($time) {
                $sec = $time % 60;
            }
            if ($time >= 60) {
                $min = floor($time / 60 % 60);
            }
            if ($time >= 3600) {
                $hour = floor($time / 3600 % 24);
            }
            if ($time >= 86400) {
                $day = floor($time / 86400 % 30);
            }
            if ($time >= 2592000) {
                $mes = floor($time / 2592000 % 12);
            }
            if ($mes) {
                return $mes . ' месяц' . self::number($mes, '', 'а', 'ев') . ($day ? (', ' . $day . ' ' . self::number($day, 'день', 'дня', 'дней') . ($hour ? ' и ' . $hour . ' час' . self::number($hour, '', 'а', 'ов') : '')) : '');
            }
            if ($day) {
                return $day . ' ' . self::number($day, 'день', 'дня', 'дней') . ($hour ? (', ' . $hour . ' час' . self::number($hour, '', 'а', 'ов') . ($min ? ' и ' . $min . ' минут' . self::number($min, 'а', 'ы', '') : '')) : '');
            }
            if ($hour) {
                return $hour . ' час' . self::number($hour, '', 'а', 'ов') . ($min ? (', ' . $min . ' минут' . self::number($min, 'а', 'ы', '') . ($sec ? ' и ' . $sec . ' секунд' . self::number($sec, 'а', 'ы', '') : '')) : '');
            }
            if ($min) {
                return $min . ' минут' . self::number($min, 'а', 'ы', '') . ($sec ? ' и ' . $sec . ' секунд' . self::number($sec, 'а', 'ы', '') : '');
            }
            return $sec . ' секунд' . self::number($sec, 'а', 'ы', '');
        } else {
            global $user;
            if ($user['set_timesdvig']) {
                $time_shift = $user['set_timesdvig'];
            } else {
                $time_shift = 0;
            }
            $time = $time + $time_shift * 3600;
            $vremja = date('j M', $time);
            $time_p[0] = date('j n Y', $time);
            $time_p[1] = date('H:i', $time);
            
            if ($adaptive && $time_p[0] == date('j n Y', $realTime + $time_shift * 60 * 60)) {
                $vremja = date('H:i', $time);
            }
            
            if ($adaptive && $time_p[0] == date('j n Y', $realTime - 60 * 60 * (24 - $time_shift))) {
                $vremja = __("Вчера");
            }
            
            $vremja = str_replace('Jan', __('Янв'), $vremja);
            $vremja = str_replace('Feb', __('Фев'), $vremja);
            $vremja = str_replace('Mar', __('Мар'), $vremja);
            $vremja = str_replace('May', __('Мая'), $vremja);
            $vremja = str_replace('Apr', __('Апр'), $vremja);
            $vremja = str_replace('Jun', __('Июн'), $vremja);
            $vremja = str_replace('Jul', __('Июл'), $vremja);
            $vremja = str_replace('Aug', __('Авг'), $vremja);
            $vremja = str_replace('Sep', __('Сен'), $vremja);
            $vremja = str_replace('Oct', __('Окт'), $vremja);
            $vremja = str_replace('Nov', __('Ноя'), $vremja);
            $vremja = str_replace('Dec', __('Дек'), $vremja);
            return $vremja;
        }
    }
    
    /**
    * 
    * @param undefined $data
    * @param undefined $type
    * 
    * @return
    */
    protected function get_data_type($data, $type = 'return') {
        if (isset($_GET['type']) && $_GET['type'] == 'json') {
            die(json_encode($data));
        } else {
            return $data;
        }
    }
    
    /**
    * Like & Dislike
    * @param undefined $like
    * @param undefined $diary_id
    * @param undefined $user_id
    * 
    * @return array()
    */
    public function get_like($diary_id, $user_id, $like) {
        $user_id = (int) $user_id;
        $diary_id = (int) $diary_id;
        $like = ($like == 0 ? 0 : 1);
        $like_count = ($like == 0 ? -1 : 1);
        
        $diary = mysql_fetch_assoc(mysql_query("SELECT n.*, 
                                                  (SELECT COUNT(*) FROM notes_like AS l WHERE l.id_notes = n.id AND l.id_user = '$user_id') AS 'like'
                                                FROM notes AS n
                                                WHERE n.id = '$diary_id' 
                                                LIMIT 1"));
        
        $err = array();
        
        if ($diary['id']) {
            if ($diary['like'] == 0) {
                mysql_query("INSERT INTO `notes_like` (`id_notes`, `id_user`, `like`) VALUES ('$diary[id]', '$user_id', '$like')");
                      mysql_query("UPDATE `notes` SET `count` = '" . ($diary['count'] + $like_count) . "' WHERE `id` = '$diary[id]' LIMIT 1");
            } else {
                $err[] = 'Вы уже голосовали';
            }
        } else {
            $err[] = 'Дневник не существует';
        }
        
        if ($err) {
            return $this->get_data_type(array(
                'error' => $err,
            ));
        }
        
        return $this->get_data_type(array(
            'success' => ($like == '1' ? 'like' : 'dislike'),
            'like' => $like,
        ));
    } 
    
    /**
    * Отправка комментария
    */
    public function get_comment($diary_id, $user_id, $msg, $reply) {
        $user_id = (int) $user_id;
        $diary_id = (int) $diary_id;
        $reply = (int) $reply;
        $user = user::get_user($user_id);
        $time = time();
        
        $diary = mysql_fetch_assoc(mysql_query("SELECT n.*
                                                FROM notes AS n
                                                WHERE n.id = '$diary_id' 
                                                LIMIT 1"));
        
        $is_err = $this->is_strlen($msg, 2, 2048);
        
        if ($is_err !== true) {
            $err[] = 'Текст сообщения слишком ' . ($is_err == 'to' ? 'длинный' : 'короткий');
        }
        
        if ($this->is_access($diary, $user_id, 'private_komm') == false) {
            $err[] = 'Автор ограничил комментирование этой записи.';
        }
        
        $msg = my_esc($msg);
        
        if (!$diary['id']) {
            $err[] = 'Дневник не найден';
        }
        
        if (!isset($err)) {
            mysql_query("INSERT INTO `notes_komm` (`id_user`, `time`, `msg`, `id_notes`) values('$user_id', '$time', '$msg', '$diary_id')");
            
            // Обсуждения
            $this->get_disc($user_id, $diary['id_user'], $diary_id);
            
            // Ответы
            if ($reply != 0) {
                $set = mysql_fetch_assoc(mysql_query("SELECT * FROM `notification_set` WHERE `id_user` = '$reply' LIMIT 1"));
                
                if ($set['komm'] == 1 && $reply != $user_id) {
                    mysql_query("INSERT INTO `notification` (`avtor`, `id_user`, `id_object`, `type`, `time`) VALUES ('$user_id', '$reply', '$diary_id', 'notes_komm', '$time')");
                }
            }
            
            return $this->get_data_type(array(
                'success' => array(
                    'msg' => output_text($msg),
                    'user_id' => $user['id'],
                    'link' => $user['link'],
                    'avatar' => $user['avatar'],
                    'icon' => $user['icon'],
                    'online' => $user['online'],
                    'time' => vremja($time),
                ),
                'msg' => 'Сообщение успешно отправлено',
            ));
        }
        
        return $this->get_data_type(array(
            'error' => $err,
        ));
    }
    
    /**
    * Проверка доступа приватности
    */
    public function is_access($diary, $user_id, $type = 'private') 
    {
        $token = true;
        if ($diary[$type] == 2) {
            $token = false;
        } 
        else {
            if ($diary[$type] == 1) {
                if ($user_id) {
                    $is_friends = mysql_fetch_assoc(mysql_query("SELECT *
                                                         FROM frends AS f
                                                         WHERE (f.user = '$user_id' AND f.frend = '$diary[id_user]') 
                                                         OR (f.frend = '$user_id' AND f.user = '$diary[id_user]')"));
                    if (!$is_friends) {
                        $token = false;
                    }
                } else {
                    $token = false;
                }
            }
        }
        if ($user_id && ( $user_id == $diary['id_user'] || user_access('notes_delete') )) {
            $token = true;
        }
        
        return $token;
    }
    
    /**
    * Редактирование прав доступа
    */
    public function get_edit_access($diary_id, $type, $select) {
        global $user;
        $diary_id = (int) $diary_id;
        $type_sess = ($type == 'private' ? 'diary_access' : 'diary_comment');
        
        if ($diary_id != 0) {
            $diary = mysql_fetch_assoc(mysql_query("SELECT n.*
                                                    FROM notes AS n
                                                    WHERE n.id = '$diary_id' 
                                                    LIMIT 1"));
            
            if (isset($diary['id']) && (user_access('notes_edit') || $user['id'] == $diary['id_user'])) {
                mysql_query("UPDATE notes SET $type = '$select' WHERE id = " . $diary_id);
            } else {
                $err = true;
            }
        } else {
            $_SESSION[$type_sess] = (int) $select;
        }
        if (!isset($err)) {
            return $this->get_data_type(array(
                'success' => array($type => $select),
                'msg' => 'Настроки доступа сохранены',
            ));            
        }
        return $this->get_data_type(array(
            'error' => 'Не удалось изменить права доступа',
        ));
    }
    
    /**
    * Редактирование и создание дневника
    */
    
    public function get_edit($diary_id, $user_id, $data) {
        $user_id = (int) $user_id;
        $diary_id = (int) $diary_id;
        $edit = false;
        $time = time();
        
        if ($diary_id != 0) {
            $diary = mysql_fetch_assoc(mysql_query("SELECT n.*
                                                    FROM notes AS n
                                                    WHERE n.id = '$diary_id' 
                                                    LIMIT 1"));
            
            if ($diary['id_user'] != $user_id && !user_access('notes_edit')) {
                $err[] = 'У вас не прав доступа';
            }
            
            $edit = true;
        }
        
        $is_err = $this->is_strlen($data['msg'], 2, 4096);
        
        if ($is_err !== true) {
            $err[] = 'Текст слишком ' . ($is_err == 'to' ? 'длинный' : 'короткий');
            $_SESSION['diary_message'] = $data['msg'];
        }
        
        $is_err = $this->is_strlen($data['name'], 3, 128);
        
        if ($is_err === 'to') {
            $err[] = 'Название слишком ' . ($is_err === 'to' ? 'длинное' : 'короткое');
            $_SESSION['diary_name'] = $data['name'];
        }
        
        $attach = array();
        
        if (isset($diary) && $diary['attachments']) {
            $attach = unserialize($diary['attachments']);
        }
        
        if (isset($_SESSION['diary']['attachments'])) {
            $attach = array_merge($attach, $_SESSION['diary']['attachments']);
        }
        
        if (isset($attach['photo']) && count($attach['photo']) > 10) {
            $err[] = 'Допускается не более 10 вложений';
        }
       
        if (!isset($err)) {
            if ($edit == false) {
                mysql_query("INSERT INTO `notes` (`time`, `msg`, `name`, `id_user`, `private`, `attachments`) 
                              VALUES('$time', '" . my_esc($data['msg']) . "', '" . my_esc($data['name']) . "', '$user_id', '" . (int) $data['private'] . "', '" . serialize($attach) . "')");
                $diary = $data;
                $diary['id'] = mysql_insert_id();
                $diary['time'] = $time;
                
                if ($diary['private'] != 2) {
                  $this->get_tape($user_id, $diary['id']);
                }
                
            } else {
                mysql_query("UPDATE `notes` 
                             SET `name` = '" . my_esc($data['name']) . "', `msg` = '" . my_esc($data['msg']) . "', `attachments` = '" . serialize($attach) . "'
                             WHERE `id` = '$diary_id' LIMIT 1");
            }    
            
            unset($_SESSION['diary_message'], $_SESSION['diary_name'], $_SESSION['diary_access'], $_SESSION['diary_comment'], $_SESSION['diary']);
            
            return $this->get_data_type(array(
                'success' => array(
                    'id' => $diary['id'],
                    'name' => $diary['name'],
                    'msg' => output_text($diary['msg']),
                    'id_user' => $user_id,
                    'time' => $this->vremja($diary['time']),
                ),
                'msg' => 'Запись успешно ' . ($edit ? 'отредактирована' : 'создана'),
                'maps' => array(
                    'diary_id' => $diary['id'],
                    'r' => 'diary',
                ),
            ));  
        }
        
        return $this->get_data_type(array(
            'error' => $err,
        ));
    }
    
    /**
    * Рассылка обсуждений друзьям и автору
    * @param undefined $user_id
    * @param undefined $author_id
    * @param undefined $diary_id
    */
    protected function get_disc($user_id, $author_id, $diary_id) {
        
        $time = time();
        
        // Друзьям
        $q = mysql_query("SELECT f.frend AS id, f.disc_notes AS set_user, d.disc_notes AS 'set'
                          FROM frends AS f
                          LEFT JOIN discussions_set AS d ON d.id_user = f.frend
                          WHERE (f.user = '$user_id' OR f.user = '$author_id') AND f.i = '1' AND f.user != '$user_id' AND f.user != '$author_id'");
        
        while ($ank = mysql_fetch_assoc($q))
        {
            if ($ank['set'] == 1 && $ank['set_user'] == 1)
            {
                $count = mysql_result(mysql_query("SELECT COUNT(*) 
                                                   FROM `discussions` 
                                                   WHERE `id_user` = '$ank[id]' AND `type` = 'notes' AND `id_sim` = '$diary_id'"), 0);
                
                if ($count == 0)
                {
                    mysql_query("INSERT INTO `discussions` (`id_user`, `avtor`, `type`, `time`, `id_sim`, `count`) 
                                 VALUES('$ank[id]', '$author_id', 'notes', '$time', '$diary_id', '1')"); 
                } else {
                    mysql_query("UPDATE discussions 
                                 SET `count` = `count` + '1', `time` = '$time' 
                                 WHERE `id_user` = '$ank[id]' AND `type` = 'notes' AND `id_sim` = '$diary_id' LIMIT 1");
                }
            }
        }
        
        // Автору
        $author = mysql_fetch_assoc(mysql_query("
                          SELECT d.count, d.id
                          FROM discussions AS d
                          WHERE d.id_user = '$author_id' AND d.type = 'notes' AND d.id_sim = '$diary_id'"));
        
        if (!$author['id'])
        {
            mysql_query("INSERT INTO `discussions` (`id_user`, `avtor`, `type`, `time`, `id_sim`, `count`) 
                         VALUES('$author_id', '$author_id', 'notes', '$time', '$diary_id', '1')"); 
        } else {
            mysql_query("UPDATE `discussions` 
                         SET `count` = `count` + '1', `time` = '$time' 
                         WHERE `id_user` = '$author_id' AND `type` = 'notes' AND `id_sim` = '$diary_id' 
                         LIMIT 1");
        }
    }
    
    /**
    * Рассылка в ленту друзьям
    * @param undefined $user_id
    * @param undefined $diary_id
    */
    protected function get_tape($user_id, $diary_id) {
        $time = time();
        
        $q = mysql_query("SELECT f.frend AS id, f.lenta_notes AS set_user, t.lenta_notes AS 'set'
                          FROM frends AS f
                          LEFT JOIN tape_set AS t ON t.id_user = f.frend
                          WHERE f.user = '$user_id' AND f.i = '1'");
        
        while ($ank = mysql_fetch_assoc($q))
        {
            if ($ank['set'] == 1 && $ank['set_user'] == 1)
            {
                mysql_query("INSERT INTO `tape` (`id_user`,`avtor`, `type`, `time`, `id_file`) 
                                 VALUES('$ank[id]', '$user_id', 'notes', '$time', '$diary_id')");
            }
        }
    }
    
    /**
    * Удаление комментариев
    * @param undefined $id
    * @param undefined $type
    * 
    * @return
    */
    public function get_delete($type, $id) {
        global $user;
        
        if ($id == 0) {
            $err[] = 'Ошибка данных';
        } 
        
        if ($type == 'comment') {
            $comment = mysql_fetch_assoc(mysql_query("
                            SELECT k.*
                            FROM notes_komm AS k WHERE k.id = '" . (int) $id . "' LIMIT 1"));
        }
        
        $diary = mysql_fetch_assoc(mysql_query("
                            SELECT n.*
                            FROM notes AS n WHERE n.id = '" . ($type == 'diary' ? $id : $comment['id_notes']) . "' LIMIT 1"));
        if (!isset($diary['id'])) {
            $err[] = 'Дневник не найден';
        }
        
        if ($user['id'] != $diary['id_user'] && !user_access('notes_delete')) {
            $err[] = 'У вас не прав доступа';
        }
        
        if (!isset($err)) {
            if ($type == 'comment') {
                mysql_query("DELETE FROM notes_komm WHERE id = " . (int) $id);
            } elseif ($type == 'diary') {
                mysql_query("DELETE FROM notes WHERE id = " . (int) $id);
                mysql_query("DELETE FROM notes_komm WHERE id_notes = " . (int) $id);
                mysql_query("DELETE FROM notes_count WHERE id_notes = " . (int) $id);
                mysql_query("DELETE FROM notes_like WHERE id_notes = " . (int) $id);
                
                mysql_query("DELETE FROM tape WHERE type = 'notes' AND id_file = '$diary[id]'");
                mysql_query("DELETE FROM notification WHERE type = 'notes' AND id_object = '$diary[id]'");
                mysql_query("DELETE FROM discussions WHERE type = 'notes' AND id_sim = '$diary[id]'");
            }  
            
            return $this->get_data_type(array(
                'success' => array('id' => (int) $id),
                'msg' => $type == 'comment' ? 'Комментарий успешно удален' : 'Запись успешно удалена',
            ));       
        }
        
        return $this->get_data_type(array(
            'error' => $err,
        ));
    }
    
    /**
    * Cоздание заголовка при отсутствии его
    * @param undefined $name
    * @param undefined $msg
    * 
    * @return $name 
    */
    public static function get_name($name, $msg, $size = 32) {
        if ($name) {
            return text($name);
        } else {
            $text = explode(" ", $msg);
            $str = '';
            
            foreach($text AS $key => $value) {
                if (strlen2($str) < $size && strlen2($value) < $size) {
                    $str .= $value . ' ';
                } elseif (strlen2($value) >= $size) {
                    $str .= substr($value, 0, $size);
                    break;
                } else {
                    break;
                }
            }
            
            return text($str);
        }
    }
    
    /**
    * Проверка длинны символов
    */
    protected function is_strlen($msg, $from = 2, $to = 1024) {
        if (strlen2($msg) > $to) {
            return 'to';
        } elseif (strlen2($msg) < $from) {
            return 'from';
        } else {
            return true;
        }
    }
}