Структура данных чата.
| |
1nferno | Дата: Понедельник, 06 Декабря 2010, 03:53 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Доброго времени суток. Частенько просматриваю этот форум, но к сожалению мало вижу толковых тем =((. Ну да ладно... давайте попробуем Собственно хотелось бы послушать мнения людей по данному вопросу. Нужно придумать структуру сообщения в котором будут передаваться сообщения чата(а скорее чатов). Имеем: обычная браузерная ММОРПГ. У игрока в игре общение происходит посредством нескольких чатов, а именно: чат локации (соответственно общение с игроками, которые находятся в текущей локации, можно адресовать сообщения кому либо, приватных сообщений нет) Чат группы (отправляются сообщения группе , в которой состоит игрок, можно адресовать сообщения, приватных нет) Чат клана (аналогично) Приватные чаты Считаю так будет лучше - отделить приватные сообщения от простых. Незнаю как реализовать приватные чаты - их же количество не определенное , и они должны появляться, когда я например захотел с кем то поговорить и их можно закрывать. Также было бы неплохо сделать динамические групповые чаты. С первыми тремя чатами(локация, группа, клан) вроде все просто, проблема с приватными. Чаты сделаны с помошью AJAX. Передается JSON в нем все сообщения для всех чатов. Клиентская сторона - только javascript, флэша нет. Структура таблицы чата думаю должна быть примерно такая: Chat table id (id сообщения) timestamp (Временная метка , когда было послано сообщение) type1 (тип сообщения, к какому чату оно относится, принимает четыре значения: location, group, clan, private) type2 (в зависимости от поля type1 принимает значения: location - id локации, group - id или имя группы, clan - название или id клана, private - id или имя игрока с кем идет приватная переписка) who (кто отсылает сообщения) to (кому адресовано сообщение) message (текст сообщения) Так у не получится отсылать сообщение нескольким игрокам(например в какойнить локации сказать одним сообщением васе и пети). Думаю JSON должен выглядеть примерно так: { type1_location:[{who:"user1", to:"user5", message:"bla bla bla"}, {who:"user7", to:"user5", message:"bla bla bla"}, {who:"user3", to:"", message:"bla bla bla"} ] type1_group:[ аналогично ] type1_clan:[ аналогично ] type1_private[ А вот тут хз как ] type1_privategroup[ было бы неплохо и такую штуку сделать ] } Вот как то так. Может это конечно и полная бредятина, может есть какое то решение попроще, или правильнее. Буду благодарен за любые подсказки.
|
|
| |
Flameberge | Дата: Понедельник, 06 Декабря 2010, 12:36 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| думаю проще будет поставить идентификатор: "private" для личных (спасибо кэп) где сообщение передаётся только получателю и "public" где передаются всем на локации/группе/клану... (в зависимости от вкладки). во многих играх где нет стопицот вкладок, т.е. их число строго зафиксировано, 4 например, есть отдельная вкладка где принимаются только личные сообщения. если игрок получил сообщение то вкладка начинает светится. вышеописанное мной тоже может быть полным бредом ибо я это не изучал достаточно глубоко и считаю вышеуказанный алгоритм правильным
|
|
| |
lvovand | Дата: Понедельник, 06 Декабря 2010, 12:59 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| я может чего не допонял, но в чем сложность, в таблице чата у тебя есть поле "to", ты когда отправляешь сообщение, если переменная "to" - чей-то id, то сообщение приватное, если "to - пустое", то сообщение видно всем
Разработка и продвижение сайтов. Дизайн
|
|
| |
cougraAcc | Дата: Понедельник, 06 Декабря 2010, 16:47 | Сообщение # 4 |
Яркая личность GD
Сейчас нет на сайте
| Приватный проще всего реализовать: например есть форма: Code <form> <input type=hidden name=priv value=0><input type=text name=msg><input type=submit> </form> <input type=hidden name=priv> Этот инпут передает значения 0 если публичное, или ид юзера кому отправляем сообщение, это если приватное, далее через js реализуем передачу текста в текстовое поле, потом скрипт обрабатывает, ну а вывод идет также, выводим только юзеру с этим ид
Сообщение отредактировал cougraAcc - Понедельник, 06 Декабря 2010, 16:48 |
|
| |
1nferno | Дата: Среда, 08 Декабря 2010, 17:06 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Спасибо за ответы. Вроде немного разобрался. Просто тупил чутка. Значит приватные сообщения будут определяться значением поля type1 = private (в базе данных). Столбец to нам впринципе не нужен, так как значение кому мы отправляем будет частью самого сообщения - message. Теперь остался еще один вопрос. Как сделать групповые приватные чаты: Например я нажимаю на какого нибудь пользователя и создается чат, потом могу добавить ещё сколько угодно игроков, и могу удалять их из чата. И такие чаты может создавать каждый игрок. И каждому игроку можно создавать несколько таких (групповых приватных) чатов. тоесть нужно гдето хранить информацию о этих чатах и кто в них входит. Есть идеи ?
|
|
| |
cougraAcc | Дата: Среда, 08 Декабря 2010, 17:36 | Сообщение # 6 |
Яркая личность GD
Сейчас нет на сайте
| 1nferno, если значение КОМУ ты будешь отправлять и у тебя будет частью месэджа то тебе придется обработчик писать который будет выдирать из присланного сообщения кому и что, не прощу хайд инпутом отправлять? Групповой приватный чат. Создаем таблицу group_chat и создаем строки, например: ид - ид сообщения ид_автор- ид создавшего ид_юзерс - список ид, юзеров которые в в чате ну там дальше сами соообщения, имена, время И пишем скрипт ставим условие.... если включен груповой то выводить сообщения только из базы приватного чата, и добавлять только туда, а пи выводе делать выборку на наличие ид в бд
|
|
| |
1nferno | Дата: Среда, 08 Декабря 2010, 17:44 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| cougraAcc, По поводу первого вопроса: нам не нужно обрабатывать сообщение и выдирать из него имя игрока(кому послано это сообщение), это не приватное сообщение и оно видно всем. по поводу всторого вопроса: так вроде не прокатит: нам нужно как то идентифицоровать чаты, ведь у каждого пользователя может быть больше одного приватного группового чата. вот например мы убираем одного пользователя из нашего чата , какая тогда должна быть запись об этом в БД?
|
|
| |
lvovand | Дата: Среда, 08 Декабря 2010, 17:50 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| количество групповых чатов ты все-таки ограничь, а то каша может начаться, а поле users будешь обновлять, если кто-то добавляется или удаляется
Разработка и продвижение сайтов. Дизайн
|
|
| |
1nferno | Дата: Среда, 08 Декабря 2010, 18:00 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Ну по количеству это понятно. Например каждый пользователь может создать до 10 групповых чатов. Идентифицировать их можно будет по пользователю и номеру. Ну а насчет поля users поконкретней можно... как все это будет происходить тогда?
|
|
| |
lvovand | Дата: Среда, 08 Декабря 2010, 18:17 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| а что непонятно? в поле предполагается список id юзеров группового чата,и когда идет отправка/чтение сообщений, проверяешь, чтобы id отправляющего/принимающего был в этом списке. Если кто-то добавляется или удаляется из чата, то берешь этот список, добавляешь нового или удаляешь лишнего и все
Разработка и продвижение сайтов. Дизайн
|
|
| |
Dizelist | Дата: Понедельник, 13 Декабря 2010, 01:09 | Сообщение # 11 |
частый гость
Сейчас нет на сайте
| на словах то все понятно,как бы это в коде реализовать... неплохо ды в примерах пояснить))
|
|
| |
1nferno | Дата: Понедельник, 13 Декабря 2010, 10:52 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| Dizelist, Видимо придется делать так: Таблица chat(тут храняться все сообщения): idchat - id сообщения timestamp - время сообщения type1 - к какому виду чата относится сообщение, значения могут быть location, group, clan, private type2 - в зависимости от type1: id локации, имя группы, имя клана, имя игрока (владельца приватного чата) type3 - id приватного чата, это поле нужно только для private чата. who - автор сообщения message - текст сообщения Таблица privatechats(тут храняца данные о приватных чатах, кто в каких чатах находится): idchar - владелец приватного чата idprivatechat - id приватного чата , число от 0 до 10 например idchar2 - имя кто состоит в чате entered - равно 0 или 1, поле нужно для приглашения кого то в чат. (тут получается примари кей состоит из первых трех столбцов) Ну и примерно вот так будет выглядеть JSON для AJAX: Code { last_id:"id", type1_location:[{who:"user1", message:"bla bla bla"}, {who:"user7", message:"bla bla bla"}, {who:"user3", message:"bla bla bla"} ], type1_group:[аналогично], type1_clan:[аналогично], type1_private[ { who:"владелец чата", idchat:"1", who:"автор сообщения" message:"bla bla bla" }, .... .... .... ] } Вот вроде все.
|
|
| |
Dizelist | Дата: Четверг, 16 Декабря 2010, 22:10 | Сообщение # 13 |
частый гость
Сейчас нет на сайте
| я не сильно понимаю эти коды, может вы бы могли написать какойто несложный рабочий пример,мнеб было проще разабратся что кчему,если вам не трудно помогите)
|
|
| |
webstrict666 | Дата: Пятница, 17 Декабря 2010, 12:45 | Сообщение # 14 |
постоянный участник
Сейчас нет на сайте
| На сколько я понял вы хотите написать чат для браузерки с "комнатами" ? Все очень просто , я могу рассказать как на PHP реализовать (метод не является единственно правильным) Давайте начнем с того что создадим дополнительные 2 таблицы к вашей игре (chat_room и room_messages) Теория: Содержание таблицы chat_room: По скольку мы рассматриваем пример, я не стал добавлять сюда дополнительный функционал. room_id - это айди нашей комнаты (INTEGER , auto_increment ) room_title - Это название нашей комнаты (varchar) Содержание таблицы room_messages: msg_id - Айди нашего сообщения (integer, auto_increment) room_id - Айди комноты куда отправлено сообщение (integer) msg_autor - Айди автора ( integer) msg_content - Сообщение (text) msg_data -Время или дата отправки( datetime) msg_to - Если приватное сообщение записываем ID получателя(integer) Практика: Code -- -- Структура таблицы `room_messages` --
CREATE TABLE IF NOT EXISTS `room_messages` ( `msg_id` int(11) NOT NULL auto_increment, `room_id` int(11) NOT NULL, `msg_autor` int(11) NOT NULL, `msg_content` text NOT NULL, `msg_data` datetime NOT NULL, `msg_to` int(11) NOT NULL, PRIMARY KEY (`msg_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- -- Дамп данных таблицы `room_messages` --
-- -- Структура таблицы `chat_room` --
CREATE TABLE IF NOT EXISTS `chat_room` ( `room_id` int(11) NOT NULL auto_increment, `room_title` varchar(30) NOT NULL, PRIMARY KEY (`room_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- -- Дамп данных таблицы `chat_room` -- Перед созданием PHP кода у тебя должна быть таблица пользователей с столбцами (ID, name) или что то подобное. Переходим к созданию PHP кода , за все у нас будет отвечать только 1 файл это файл chat.php (будьте бдительны! если вы сами писали игру то трудностей не каких возникнуть не должно... а если взяли китайские скрипты то не мучайте извилины.) и так если вы используете модульную систему(game.php?mod=chat) то сессию не подключаем, если у вас корейская(chat.php) система то сессию вам придется подключить( session_start(); ) . Вы будите в закоментированных строках видеть МС(модульная система) и КС (корейская система) если вы используете МС то удаляем строки для КС и на оборот. Начнем.... LOADING Дополнение будет позже
http://GAMESKROL.RU Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
|
|
| |
Assasin | Дата: Пятница, 17 Декабря 2010, 13:15 | Сообщение # 15 |
web-coder
Сейчас нет на сайте
| chat.php Code <?php
Подключаем сессию и другие нужные модули/классы Подключаемся к БД
?> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> var mode = 1; $(document).ready(function{ setInterval(chat_update, 1000); function chat_update(){ $.get('room.php', {'mode': mode}, function(data){ $('#post').html(data); }); } $('#post_mess').click(function(){ var txt = $('#text_field').val(); $.get('post.php', {'txt': txt, 'name': 'bugoga', 'mode': mode, 'private': ''}, function(data){ $('#post').html(data); $('#text_field').val('') $('#text_field').focus(); }); return false; }); $('#room1').click(function(){ mode = 1; return false; }); $('#room2').click(function(){ mode = 2; return false; }); }); </script> <a href='#' id='room1'>Name Room 1</a> <a href='#' id='room2'>Name Room 2</a> <div id='post'></div> <div id='button'><form method='post'><input type='text' id='text_field'><input type='submit' id='post_mess'></form></div> room.php Code <?php
function mess($mode) { $result = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."'") or die(mysql_error()); $count = mysql_num_rows($result); $count -= 20; if($count < 0) { $count = 0; } $zap_mess = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."' ORDER BY `msg_id` ASC LIMIT ".$count.",20") or die(mysql_error()); while ($row_mess = mysql_fetch_array($zap_mess)) { $mess .= "<div>[".date('H:i', $row_mess['msg_data'])."] ".$row_mess['msg_autor'].": ".$row_mess['msg_content']."</div>"; } return $mess; }
if ($_GET) { Подключаемся к БД $mode = preg_replace('/[^0-9]/','',$_GET['mode']); switch($mode) { case 1: echo mess(1); break; case 2: echo mess(2); break; } }
?> post.php Code if ($_GET) { Подключаемся к БД $mode = preg_replace('/[^0-9]/','',$_GET['mode']); $txt = htmlspecialchars($_GET['txt']); $name = htmlspecialchars($_GET['name']); $name_private = htmlspecialchars($_GET['private']); $time = time(); $txt = iconv('UTF-8', 'CP1251', $txt); $name = iconv('UTF-8', 'CP1251', $name); mysql_query("INSERT INTO `room_messages` (`room_id`,`msg_data`,`msg_autor`,`name_private`,`msg_content`) VALUES ('".$mode."','".$time."','".$name."','".$txt."')") or die(mysql_error()); function mess($mode) { $result = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."'") or die(mysql_error()); $count = mysql_num_rows($result); $count -= 20; if($count < 0) { $count = 0; } $zap_mess = mysql_query("SELECT * FROM `room_messages` WHERE `room_id`='".$mode."' ORDER BY `msg_id` ASC LIMIT ".$count.",20") or die(mysql_error()); while ($row_mess = mysql_fetch_array($zap_mess)) { $mess .= "<div>[".date('H:i', $row_mess['msg_data'])."] ".$row_mess['msg_autor'].": ".$row_mess['msg_content']."</div>"; } return $mess; } switch($mode) { case 1: echo mess(1); break; case 2: echo mess(2); break; } } Это без привата, но приват можно самому сделать основываясь на данном коде. Возможно где то ошибся, так что сильно не пинать
|
|
| |
webstrict666 | Дата: Пятница, 17 Декабря 2010, 13:46 | Сообщение # 16 |
постоянный участник
Сейчас нет на сайте
| + красава))) но я хотел предложить на case мутить) чтоб переключать было проще) блин ну ладно Добавлено (17.12.2010, 13:46) --------------------------------------------- а все красава) заметил что как я хотел мутить) (думаем на одной волне видно) ток не понятно к чему тут Ява?
http://GAMESKROL.RU Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
|
|
| |
Assasin | Дата: Пятница, 17 Декабря 2010, 13:58 | Сообщение # 17 |
web-coder
Сейчас нет на сайте
| java-script для обновления сообщений чата + для отправки их не перезагружая страницу.
|
|
| |
webstrict666 | Дата: Пятница, 17 Декабря 2010, 14:13 | Сообщение # 18 |
постоянный участник
Сейчас нет на сайте
| все понятно бальшое спасибо се на заметку возьму)
http://GAMESKROL.RU Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
|
|
| |
Dizelist | Дата: Воскресенье, 06 Февраля 2011, 17:35 | Сообщение # 19 |
частый гость
Сейчас нет на сайте
| огромное спасибо webstrict666 и Assasin,очень хорошие примерчики Добавлено (06.02.2011, 06:02) --------------------------------------------- как бы сделать чтоб приватные сообщения видел только я?? $row_mess['to']= имя кому пишем. Code <?php include "config.php";
$data = mysql_connect($base_name, $base_user, $base_pass); mysql_select_db($db_name);
function mess($privat) { $chat = mysql_query("select * from chat");
while ($row_mess = mysql_fetch_array($chat)) { $mess .= "<div>[".date('H:i', $row_mess['data'])."] ".$row_mess['users']."] to [".$row_mess['to']."] ".$row_mess['msg']."</div>"; }
return $mess; }
echo mess(test); ?> Добавлено (06.02.2011, 17:35) --------------------------------------------- подскажите как реализовать вывод всех сообщений но чтоб приватные адресованные мне видел только я... вот по этому примеру Code while ($row_mess = mysql_fetch_array($chat)) { $mess .= "<div>[".date('H:i', $row_mess['data'])."] ".$row_mess['users']."] to [".$row_mess['to']."] ".$row_mess['msg']."</div>"; }
Сообщение отредактировал Dizelist - Воскресенье, 06 Февраля 2011, 06:02 |
|
| |
lvovand | Дата: Воскресенье, 06 Февраля 2011, 17:43 | Сообщение # 20 |
старожил
Сейчас нет на сайте
| запрос немного подправить надо: $chat = mysql_query("select * from chat where `to` = '' OR `to` = '".$privat."' ");
Разработка и продвижение сайтов. Дизайн
|
|
| |
|