Страница 1 из 1

Игры «Снежки» и «Анаграммы»

Добавлено: 13:39, 07.11.2010
Fallout
Добрый день, хотел спросить, когда появятся боты для 5-ой версии это: "Снежки" и "Анаграммы" ?

Re: Обратите внимание !

Добавлено: 16:14, 07.11.2010
инопланетянен
Fallout писал(а):Добрый день, хотел спросить, когда появятся боты для 5-ой версии это: "Снежки" и "Анаграммы" ?

Это всё можно подключить от 4-ой версии через плагин Bots-Plugin от @serg@. Анаграммы мне не нужны а снежки отлично работают в викторине от скифа.

Re: Обратите внимание !

Добавлено: 16:59, 07.11.2010
Chip
Подключать всё равно не удобно! Лучше бы сделали для сервера,такую программу которая присоединяла бы ботов от 4.хх версии...

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 20:00, 07.11.2010
@serg@
Fallout писал(а):Добрый день, хотел спросить, когда появятся боты для 5-ой версии это: "Снежки" и "Анаграммы" ?
Для пятой версии это реалиовать вообще не реально, так как пятёрка не держит ботов. Это либо с нуля писать в виде плагина, или через плагин-мост, такой как Bots-Plugin.
Chip писал(а):Подключать всё равно не удобно! Лучше бы сделали для сервера,такую программу которая присоединяла бы ботов от 4.хх версии...
Ты сам себе противоречишь, сначала говоришь что мост это не удобно, потом просишь сделать этот мост. Bots-Plugin пока реализован только для клиента, когда его допишу он отличаться почти не будет, только появятся поля для ввода имени пользователя и пароля. В любом случае для моста есть 1 важный недостаток, каналы и пользователи с символами Unicode ботом не воспримутся, т.к. протокол ботов по умолчанию не держит таковых.

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 20:11, 07.11.2010
supermet
@serg@ писал(а): В любом случае для моста есть 1 важный недостаток, каналы и пользователи с символами Unicode ботом не воспримутся, т.к. протокол ботов по умолчанию не держит таковых.
Ничто не помешает воспользоваться функциями Windows API для преобразования строки в юникод и обратно

Код: Выделить всё

int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
// и
int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 22:16, 07.11.2010
@serg@
supermet писал(а):Ничто не помешает воспользоваться функциями Windows API для преобразования строки в юникод и обратно

Код: Выделить всё

int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
// и
int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);
Если не сложно подскажи как они работают, даже если ник пользователя содержит коды из одного диапозона кодировки ты переконвертишь в Windows-строку, и бот воспримет ка-то это, но в какой кодировке он ответит тебе, это ты откуда узнаешь? Из чего конвертировать будешь?

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 23:41, 07.11.2010
supermet
@serg@ писал(а):Если не сложно подскажи как они работают, даже если ник пользователя содержит коды из одного диапозона кодировки ты переконвертишь в Windows-строку, и бот воспримет ка-то это, но в какой кодировке он ответит тебе, это ты откуда узнаешь? Из чего конвертировать будешь?
Вот пример конвертирования (C++). Если пишешь в Delphi, переделать не сложно.

Код: Выделить всё

//Из обычной строки в юникод UTF-16 
std::wstring strtows(const std::string str, UINT codePage)
{
   std::wstring ws;
   int n = MultiByteToWideChar(codePage, 0, str.c_str(), str.size()+1, /*dst*/NULL, 0);
   if(n)
   {
      ws.resize(n-1);
      if(MultiByteToWideChar(codePage, 0, str.c_str(), str.size()+1, /*dst*/&ws[0], n) == 0)
         ws.clear();
   }
   return ws;
}
//Из юникод UTF-16 в обычную строку
std::string wstostr(const std::wstring ws, UINT codePage)
{
   std::string str;
   int n = WideCharToMultiByte(codePage, 0, ws.c_str(), ws.size()+1, /*dst*/NULL, 0, /*defchr*/0, NULL);
   if(n)
   {
      str.resize(n-1);
      if(WideCharToMultiByte(codePage, 0, ws.c_str(), ws.size()+1, /*dst*/&str[0], n, /*defchr*/0, NULL) == 0)
         str.clear();
   }
   return str;
}
// Из обычной строки в одной кодировке в строку в другой кодировке
std::string chcp(const std::string str, UINT codePageSrc, UINT codePageDst)
{
   return wstostr(strtows(str, codePageSrc), codePageDst);
}
//  Пример
std::string strAcpSrc = "строка";
std::string strUtf = chcp(strAcpSrc, CP_ACP, CP_UTF8);
std::string strAcp = chcp(strUtf, CP_UTF8, CP_ACP);
std::cout << ((strAcpSrc == strAcp) ? "success" : "error");
std::cin.get();
В 5-й версии коммфорта бот всегда принимает и отправляет строки в UTF-16
А в 4 - обычные строки (CP_ACP)

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 17:14, 08.11.2010
-=SJ=-
supermet писал(а):Вот пример конвертирования (C++). Если пишешь в Delphi, переделать не сложно.
Как я понял @serg@ имеет ввиду потерю информации при конвертировании из utf16 в ansi с невозможностью восстановить эту информацию при обратном перекодировании.
Выкрутится тут можно передавая юникодовские символы в виде кода с управляющим символом в начале.
Причем управляющий символ должен быть выбран таким образом чтобы он не мог содержатся в никнеймах.
(С похожим я сталкивался при написании Irc2ComGate)
Допустим - ® юникодовский символ
Тогда от плагина к боту имя Ю®чик должно передаваться как то так : Ю\00AEчик
где \ управляющий символ,а 00АЕ - шестнадцатеричный код символа ®
ну а в обратную сторону строку надо нормализовывать в обратном порядке.
Тогда потери информации быть не должно.

Re: Игры «Снежки» и «Анаграммы»

Добавлено: 21:55, 08.11.2010
@serg@
-=SJ=- писал(а):Как я понял @serg@ имеет ввиду потерю информации при конвертировании из utf16 в ansi с невозможностью восстановить эту информацию при обратном перекодировании.
Да именно это я и имел ввиду, вначале я хотел в своём плагине реализовать передачу юникод-символа как двух ansi, но тут массу проблем может возникнуть, к примеру такие ANSI символы как 00,10,13 и ещё некоторые надо будет заменять на некие другие. Но и тут незадача, в четвёртой версии были вроде как запрещённые символы, которые при этом могли программисты в ботах использовать для своих целей, если произойдёт такое наложение, то бот откажется работать. После долгих размышлений я пошел по следующему пути, решился воспользоваться стандартным приведением типов к ansi в с++ builder 2010. Как я понял это приведение типов просто отбрасывает младший байт а учитывает только старший, что тоже является конвертацией с потерями.