За последние 24 часа нас посетил 17151 программист и 1487 роботов. Сейчас ищут 746 программистов ...

простой ajax чат

Тема в разделе "Прочее", создана пользователем Padaboo, 13 июн 2010.

  1. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    сделано по мотивам ajax
    бд на файлах от Luge http://e-luge.net/blog/full/baa73303.html
    и новой лицензии GPL\хуи придуманной совместно с Apple
    как работает смотреть тут http://www.ananastelecom.ru/chat/
    скачать тут http://www.ananastelecom.ru/chat.zip

    и пару классов на троллинг
    PHP:
    1.  
    2. <?
    3. class Сhat{
    4.  
    5.     public static $user_name = null;
    6.  
    7.     /**
    8.     * Добавляет строку в файл чата
    9.     * @var string
    10.     */
    11.     public static function add_message($var){
    12.  
    13.         $file = file(CHAT_PATH);
    14.  
    15.         if(count($file)>CHAT_MAX_ROW){
    16.  
    17.             unset($file[0]);
    18.          
    19.         }
    20.        
    21.         array_push($file,$var."\r\n");
    22.  
    23.     $fp = fopen(CHAT_PATH, "w");
    24.     fputs($fp, implode("", $file));
    25.     fclose($fp);
    26.     }
    27.  
    28.     /**
    29.     * Читает чат из файла
    30.     * @return mixed
    31.     */
    32.     public static function get_chat(){
    33.  
    34.         return file_get_contents(CHAT_PATH);
    35.     }
    36.  
    37.     /**
    38.     * Обновляет\записывает юзеров в бд
    39.     * @var $name имя пользователя
    40.     * @var $db объект бд
    41.     */
    42.     public static function update_users($name,$db){
    43.        
    44.         $user_hash = md5($_SERVER["HTTP_USER_AGENT"].$_SERVER['REMOTE_ADDR']);
    45.        
    46.         //ищем нашего юзера
    47.         $find = array(
    48.         'from'=>'users',
    49.         'fields' => '*',
    50.         'where' => array(
    51.             'key' => 'userhash',
    52.             'val' => $user_hash,
    53.             'type' => 'eq'),
    54.         'num' => '1');
    55.  
    56.         $r = $db->select($find);
    57.        
    58.         //если есть обновляем ему имя и время
    59.         if ($r) {
    60.  
    61.                     $id = $r[0]['idx'];
    62.  
    63.                     $update = array(
    64.                                    'from'   => 'users',
    65.                                    'update' => array('name' => $name,
    66.                                                      'time' => time()),
    67.                                    'whereId'=> $id
    68.                                    );
    69.  
    70.                     $db->update($update);
    71.  
    72.         } else {
    73.                     //если нет то записываем
    74.                    $insert = array(
    75.                                     'userhash'  => $user_hash,
    76.                                     'name'      => $name,
    77.                                     'time'      => time()
    78.                                    );
    79.  
    80.                     $db->insert('users',$insert);
    81.         }
    82.  
    83.     }
    84.  
    85.     /**
    86.     * Вытаскивает всех юзеров и обертывает в html
    87.     * @var $db объект бд
    88.     * @return mixed
    89.     */
    90.     public static function get_users($db){
    91.          $find = array(
    92.         'from'=>'users',
    93.         'fields' => '*',
    94.                 'where' => array(
    95.             'key' => '',
    96.             'val' => '',
    97.             'type' => 'con'),
    98.         'num' => 'all');
    99.  
    100.          $r = $db->select($find);
    101.  
    102.        if ($r) {
    103.  
    104.             foreach ($r as $v) {
    105.  
    106.         $v = $v['res'];
    107.         echo '<div class="user">'.$v['name'].'</div>';
    108.  
    109.             }
    110.         }
    111.  
    112.     }
    113.  
    114.     /**
    115.     * Удаляет вышедших юзеров
    116.     * @var $db объект бд
    117.     * @var $max_save_time максимальное время бездействия
    118.     */
    119.     public static function delete_users($db,$max_save_time){
    120.  
    121.          $time = time();
    122.  
    123.          $find = array(
    124.         'from'=>'users',
    125.         'fields' => '*',
    126.                 'where' => array(
    127.             'key' => '',
    128.             'val' => '',
    129.             'type'=> 'con'),
    130.         'num' => 'all');
    131.  
    132.          $r = $db->select($find);
    133.          
    134.        if ($r) {
    135.            
    136.             foreach ($r as $v) {
    137.  
    138.         $v = $v['res'];
    139.  
    140.                 $user_hash=$v['userhash'];
    141.              
    142.                 $time_to_delete = $v['time'] + 60;
    143.  
    144.                 if($time_to_delete < $time){
    145.  
    146.                     $delete = array(
    147.                                     'from'   => 'users',
    148.                                     'where' => array(
    149.                                                      'key' => 'userhash',
    150.                                                      'val' => $user_hash,
    151.                                          'type' => 'eq')
    152.                                    );
    153.  
    154.                    $db->delete($delete);
    155.                    
    156.                 }
    157.  
    158.             }
    159.         }
    160.     }
    161.  
    162.     /***
    163.      * приводит входящик данные к нужному виду
    164.      *
    165.      * @var $var входящая переменная
    166.      * @var $length максимальная длинна переменной
    167.      * @var $default переменная по умолчанию
    168.      */
    169.     public static function validator($var,$length,$default){
    170.  
    171.         $var = substr($var, 0, $length);
    172.  
    173.         if($var == ''){
    174.  
    175.             $var = $default;
    176.  
    177.         }
    178.  
    179.         return htmlspecialchars($var);
    180.     }
    181. }
    PHP:
    1.  
    2. <?
    3. class Parser {
    4.  
    5.     /**
    6.     * Имя пользователя.
    7.     * @var string
    8.     */
    9.     protected $user_name    = null;
    10.    
    11.     /**
    12.     * Массив со смайлами и путями к ним.
    13.     * @var array
    14.     */
    15.     protected $smiles_array = array();
    16.  
    17.     /**
    18.     * Конструктор
    19.     */
    20.     public function  __construct($name,$message,$smiles) {
    21.  
    22.         $this->smiles_array = $smiles;
    23.  
    24.         $this->user_name    = $name;
    25.  
    26.         $this->user_message = $message;
    27.  
    28.     }
    29.    
    30.     /**
    31.     * Удаление нежелательных символов и обрезание
    32.     * до нужной длинны
    33.     * @param string $text переменная для обработки
    34.     * @param string $length максимальная длинна переменной.
    35.     * @return string
    36.     */
    37.  
    38.     /**
    39.     * Заменяет подстроку на картинку смайлика
    40.     *
    41.     * @return string
    42.     */
    43.     public  function set_smiles(){
    44.  
    45.         foreach ($this->smiles_array as  $key => $value ){
    46.  
    47.            $this->user_message = str_replace($key, "<img src='".$value."'>", $this->user_message);
    48.  
    49.         }
    50.  
    51.     }
    52.  
    53.     /**
    54.     * Формирует строку сообщения
    55.     *
    56.     * @return string
    57.     */
    58.     public  function build_string(){
    59.  
    60.         return '<span class="chat_string">'.'['.date("H:i:s").']'.'['.$this->user_name.'] '.$this->user_message.'</span><br/>';
    61.  
    62.     }
    63.  
    64. }
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Если уж говорить об ООП, то чат, по сути, является отдельной сущностью.
    Чат имеет список сообщений, т.е объект MessageList, содержащий объект Message, который в свою очередь содержит атрибуты Author, Date, Text и методы Remove, Change.
    MessageList получает сообщения из списка и представляет их в виде объектов.
    Объект Chat оперирует с объектом MessageList, который имеет методы Push, Remove, RemoveLine, GetMessageById, Update.

    Упрощенная модель, но это по части ООП =)
    Насчет кодировки и других мелочей я тебе уже сказал в чате.

    Всё, я кончил.
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    ясно, в следующий раз сделаю правильно, надо только придумать что писать)
    это что объект в объект передавать надо будет?
    а в чате не смог даже соблазниться :D
     
  4. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Апельсин
    сам в шоке.. ты чего там на шаманил?)))

    ммм, а во всех чатах так, нет разве? или кнопку надо поставить "не обновлять" ?
     
  6. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Padaboo
    Ничего не трогал, начальник. Моя вводить, а оно мешальбе не понимать)
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Это то, чем учит Apple?
     
  8. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Kreker
    не, это новое расширение для любой лицензии :D
    учить этим инструментом можно, но лучше наказывать
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Я не знаю как там во всех чатах...
    Кнопка "не обновлять" на мой чисто субъективный взгляд не лучшая идея....
    Надо чтоб он дописывал в конец, но не менял положение арии с чатом. Или на худой конец, обновлял только при появлении новых сообщений. Или сделать основное окно не прокручиваемым (но растянуть по высоте) и сделать отдельную кнопку "посмотреть историю".
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Это то, чем ты подумал, прежде чем это написать?
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Прости, у меня бот отвечает периодически. Он агрессивный слишком...
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    чат неправильный. чат такого класса должен быть в одном файле
     
  13. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    еххх еше бы Luge добавил встроенный order by и поправил delete по индексу цены бы этой штуке не было...
    но он куда то пропал :\
    мне тут сказали что если бд на файлах, то я насилую винт, правда насилую или нет?^^
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Дак есть же txtSQL.
    Сам не пользовался, но штука популярная.
     
  15. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Padaboo
    Смотря как ею распоряжаться.
    Но в целом - да, насилуешь.
     
  16. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Я на txtsql делал первый сайт (точнее самый первый был вообще на кучке txt, а этот первый с каким никаким скулем) - вполне работало. Но при частых запросах пару раз файл был занят и при попытке записи в него он просто становился нулевого размера (счетчики посещения часто слетали).
     
  17. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    тогда вырублю и переведу на редис
     
  18. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Чтото не пингуется твой сайт :( "не удалось обнаружить узел ananastelecom.ru"
     
  19. Я вам жуткую тайну скажу, ребята... даже великий Оракл хранит данные - в файлах! ) Все бд хранят данные в файлах. Мы вообще все практически храним в файлах :) Потому что для хранения используется файловая система ))
     
  20. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    флоппик
    понятно))
    Apple
    насчет txtSQL почитал в нете, пишут что файлы частенько обнуляются при большой нагрузке, как и писал antonn
     
  21. Антошка

    Антошка Активный пользователь

    С нами с:
    7 мар 2010
    Сообщения:
    62
    Симпатии:
    0
    флоппик
    Всё правильно, БД хранит всё в файлах, но вот часто используемые таблицы она хранит в оперативной памяти, а следовательно и на винт нагрузки никакой, на то они и БД чтоб оптимизировать нагрузку. Или я что то не понимаю?
     
  22. Namer

    Namer Активный пользователь

    С нами с:
    14 апр 2010
    Сообщения:
    492
    Симпатии:
    0
    Padaboo, а авторизации в нем не предусмотрено? А то любой может отвечать от имени админа или другого пользователя.
    А вообще прикольно! Я уже скачал и попробовал. В нем дыр нет? Можно на хост кидать?
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Никто не знает про кэш жесткого диска? o_0
     
  24. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Namer
    на то он и simple) там же админа по сути нет)можешь сделать массив с запрещенными именами проверять его in_array и присваивать Unknown) входящие переменные проверяются htmlspecialchars если переменные не заданы то exit и если ставить будешь то $var = substr($var, 0, $length); поменяй на $var = mb_substr($var, 0, $length,"utf-8"); чтобы кроказябр не было в core/class/chat.php
     
  25. это миф ) да, можно заставить хранить определенные таблицы в памяти, можно заюзать ndbcluster, который хранит все таблицы в памяти, НО ЭТО ВСЕ НЕ ВАШИ СЛУЧАИ, по одной простой причине:
    в 99% случаев ресурс жесткого диска намного ДЕШЕВЛЕ ресурса ОЗУ, поэтому без особой нужды так никто не делает, естественно.