Воскресенье, 17 Ноября 2024, 19:45

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Структура данных чата.
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
частый гость
Сейчас нет на сайте
sad я не сильно понимаю эти коды, может вы бы могли написать какойто несложный рабочий пример,мнеб было проще разабратся что кчему,если вам не трудно помогите) smile
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 biggrin Дополнение будет позже


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;
  }
}

Это без привата, но приват можно самому сделать основываясь на данном коде. Возможно где то ошибся, так что сильно не пинать smile

webstrict666Дата: Пятница, 17 Декабря 2010, 13:46 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
+ красава))) но я хотел предложить на case мутить) чтоб переключать было проще) блин ну ладно

Добавлено (17.12.2010, 13:46)
---------------------------------------------
а все красава) заметил что как я хотел мутить) (думаем на одной волне видно) smile ток не понятно к чему тут Ява?


http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
AssasinДата: Пятница, 17 Декабря 2010, 13:58 | Сообщение # 17
web-coder
Сейчас нет на сайте
java-script для обновления сообщений чата + для отправки их не перезагружая страницу.
webstrict666Дата: Пятница, 17 Декабря 2010, 14:13 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
все понятно smile бальшое спасибо се на заметку возьму)

http://GAMESKROL.RU
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
DizelistДата: Воскресенье, 06 Февраля 2011, 17:35 | Сообщение # 19
частый гость
Сейчас нет на сайте
smile огромное спасибо 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."' ");


Разработка и продвижение сайтов. Дизайн
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг