Чат

Думаю в любой онлайн игре необходимо понимание что играешь с живыми людьми,
а не ботами, лучше всего для этой цели подходит чат.

В качестве отдельного куска проекта, я решил реализовать его, для хранения на сервере
воспользуемся, следующей структурой.


typedef struct
{
int id;
char type;
int user_id;
int timestamp;
string message;
} TChatMessage;

Дальше есть варианты, использовать для хранения vector или очередь - queue.
В самом процессе хранить все сообщения наверное очень жестоко, а для удаления очередь предпочтительней.
typedef queue TListChatMessage;
TListChatMessage listChatMessage;

Для пользователей(юзеров) тоже придется кое-что придумать

typedef struct
{
int id;
string nick;
} TUser;
map userList;

Для упрощения сделаем чат без регистрации - просто первое сообщение от неизвестного человека
(в таблице пользователей нет такого nick'а) - добавляем его и присваиваем id.

Цветовая палитра
Было бы неплохо, еслибы сообщения от разных пользователей (или хотябы их ник) - отличались цветом.
Решение в лоб, сделать массив цветов и для каждого нового пользователя хранить его цвет, но
тогда у сообеседников будут разные цвета для одного и тогоже пользователя.
На первый взгляд ничего страшного, но будет очень не красиво если в чате кто-то напишет
типа "эй красный, что у тебя за ник такой?".

Поэтому решено все таки цвета выдавать с сервера.
А вот какие они будут? Опять же решение в лоб нам подсказывает - набить ручками, 10 или 110 цветов -
но это как-то не айс. Поэтому код.
Разнообразные цвета будем генерить из RGB палитры
XX0000
00XX00
0000XX
XXXX00
00XXXX
XX00XX
Всего 6 вариантов, градируя их по яркости - будем получать новые оттенки.
total_user = userList.size(); - количество собеседников
int color,k = num%6,d=10;
int r = 255-(num/6)*d;
if (k==0) color=RGB(r,0,0);
if (k==1) color=RGB(0,r,0);
if (k==2) color=RGB(0,0,r);
if (k==3) color=RGB(r,r,0);
if (k==4) color=RGB(0,r,r);
if (k==5) color=RGB(r,0,r);

Примерно до 120-130 пользователей будут иметь разные цвета

Flash
В Flash создаем окно чата - Dynamic text, строку ввода&строка логина - Dynamic text, и кнопку - на нее вешаем
скрипт отправки, а также на idle вешаем таймер, для проверки новых сообщений каждые 5 секунд.
При проверки отправляем последний id_message - при первоначальном запуске = 0.
В ответ от сервера приходит переменные num_msg, msg1,msg2,msg3,msg4,msg5 соотвественно
(ставим принудительное ограничение на получение каждый раз 5 сообщений),
id_message - ид максимального сообщения, nick1,nick2,nick3,nick4,nick5 - ид логинов.
Проверяем есть ли все ид в локальной флешке. Если нет то отправляем запрос /flash/info_user/nick[x]
в ответ получаем nickid=...&nickname=...&nickcolor=...
Отправку осуществляем /flash/chat/send?<сообщение>, на сервере по ип и (а в дальнейшем по сессии)
проверяем от кого пришло сообщение и запоминаем его в listChatMessage
В Flash после отправки принудительно скидываем таймер для проверки обновлений.

Код уже почти написан, завтра выложу