Исходник Auto-Chat Translate

Модератор форума
Модератор
Статус
Оффлайн
Регистрация
2 Дек 2016
Сообщения
2,368
Реакции[?]
1,879
Поинты[?]
34K
Суть заключается в том, что вы пишите в чат сообщение , а ваш (или не ваш :roflanEbalo:) чит переводит на нужный язык.
Пример:
Для начала пишем в чат: @ru-en
1 - Язык на котором пишем.
2 - На какой перевести.
После этого можем писать "Привет", а на выходе получим "Hello"

chat_translator.h
C++:
class chat_translator : public singleton<chat_translator> {
public:
  auto client_cmd(const char* cmd, std::string& buf) -> int;
  auto dispatch_user_message(int entity_id, const std::string& msg) -> void;
  auto thread_tick() -> void;
public:
  auto translate(const std::string& text, const std::string& lang) -> std::string;

private:
  std::string lang_me_{""};
  std::string lang_other_{""};

  struct msg_t {
    int entity_id;
    std::string msg;
  };
  std::deque<msg_t> msgs_;
};

enum EChatTranslatorResult {
  ECTR_None,
  ECTR_SetLang,
  ECTR_Translate
};
chat_translator.cpp
C++:
#include "stdafx.h"
#include "chat_translator.h"
#include "json.hpp"
#include <wininet.h>
#pragma comment(lib, "wininet.lib")

auto chat_translator::client_cmd(const char* cmd, std::string& buf) -> int {
  if (auto command = std::string_view(cmd); !command.compare(0, 3, "say") && strstr(cmd, "\"")) {
    auto tmp = std::string(strstr(cmd, "\""));
    auto msg = tmp.substr(1, tmp.size() - 2);

    bool is_say_team = command[3] == '_';
    bool set_lang_local = msg[0] == '@';
    bool set_lang_other = msg[0] == '#';

    if (set_lang_local || set_lang_other) {
      auto lang = msg.substr(1);
      auto& lang_ = set_lang_local ? lang_me_ : lang_other_;
      lang_ = lang;
      char print_msg[255];
      sprintf_s(print_msg, "[Auto - Translator(%s)] %s",
        set_lang_local ? "Me" : "Other",
        lang.empty() ? "disabled" : lang.data());
      chud_chat::get()->printf(print_msg);
      return ECTR_SetLang;
    }
    if (auto translated = translate(msg.data(), lang_me_); !translated.empty()) {
      buf = (is_say_team ? std::string("say_team \"") : std::string("say \"")) + translated + std::string("\"");
      return ECTR_Translate;
    }
  }
  return ECTR_None;
}

auto chat_translator::dispatch_user_message(int entity_id, const std::string& msg) -> void {
  if (lang_other_.empty())
    return;

  if (entity_id != sdk::g_engine_client->get_local_player() - 1) {
    msgs_.push_back(msg_t { entity_id, msg });
  }
}

auto chat_translator::thread_tick() -> void {
  while (!msgs_.empty()) {
    auto msg = msgs_.front();
    msgs_.pop_front();
    if (auto ent = cplayer::get_player(msg.entity_id); ent) {
      if (auto translated = translate(msg.msg, lang_other_); !translated.empty()) {
        auto nick = ent->get_player_info().szName;
        auto team = ent->m_iTeamNum();
        if (team == TEAM_COUNTER_TERRORIST)
          chud_chat::get()->printf(" \x03[%s]: \x0A%s", nick, translated.c_str());
        else if (team == TEAM_TERRORIST)
          chud_chat::get()->printf(" \x09[%s]: \x0A%s", nick, translated.c_str());
      }
    }
  }
}

auto chat_translator::translate(const std::string& text, const std::string& lang) -> std::string {
  // https://github.com/nlohmann/json
  using json = nlohmann::json;
  const std::string url = "https://translate.yandex.net/api/v1.5/tr.json/translate";
  const std::string key = "Ваш апи ключ";

  auto _url = url + std::string("?key=") + key;
       _url += std::string("&text=") + text;
       _url += std::string("&lang=") + lang;

  if (auto connect = InternetOpenA("GoogleChrome", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); connect) {
    if (auto address = InternetOpenUrlA(connect, _url.c_str(), NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); address) {
      char data_received[1024];
      DWORD number_of_bytes_read = 0;

      if (InternetReadFile(address, data_received, 1024, &number_of_bytes_read) && number_of_bytes_read) {
        std::string output(data_received, number_of_bytes_read);
        InternetCloseHandle(address);
        InternetCloseHandle(connect);

        auto json = json::parse(output.c_str());
        //std::cout << json.dump() << std::endl;
        auto code = json["code"].get<int>();
        if (code == 200)
          return json["text"][0].get<std::string>();
      }
    }
    else {
      InternetCloseHandle(connect);
    }
  }

  return std::string();
}

hooks.cpp
C++:
auto __fastcall hooks::hk_dispatch_user_message(void *thisptr, void*, unsigned int msg_type, unsigned int unk1, unsigned int nBytes, const void *msg_data) -> bool {
  static const auto o_dispatch_user_message = mgr.get_original<dispatch_user_message_fn>("dispatch_user_message");

  if (msg_type == CS_UM_SayText2) {
    auto [entity_id, chat_msg] = protobuffs::parse_chat_message(nBytes, msg_data);
    chat_translator::get().dispatch_user_message(entity_id, chat_msg);
  }
  return o_dispatch_user_message(thisptr, msg_type, unk1, nBytes, msg_data);
}

auto __fastcall  hooks::hk_client_cmd(void* ecx, void*, const char* cmd) -> void {
  static const auto o_client_cmd = mgr.get_original<client_cmd_fn>("client_cmd");

  std::string buf;
  if (auto result = chat_translator::get().client_cmd(cmd, buf); result == ECTR_Translate) {
    return o_client_cmd(ecx, buf.c_str());
  }
  else if (result == ECTR_SetLang) {
    return;
  }

  o_client_cmd(ecx, cmd);
}
Добавить кусок кода в протобаф

C++:
//https://github.com/bananasss00/Protobuff-Parser-Writer

#define CS_UM_SayText2 6

make_struct(CCSUsrMsg_SayText2, 5)
  make_field(ent_idx, 1, TYPE_INT32)
  make_field(chat, 2, TYPE_BOOL)
  make_field(msg_name, 3, TYPE_STRING)
  make_field(params, 4, TYPE_STRING)
  make_field(textallchat, 5, TYPE_BOOL)
};

auto parse_chat_message::parse_chat_message(unsigned int nBytes, const void* msg_data) -> std::tuple<int, std::string> { // return: [entity_id, chat_msg]
  CCSUsrMsg_SayText2 msg((void*)msg_data, nBytes);

  int ent_idx = msg.get_ent_idx().Int32() - 1;
  auto text = msg.getAll_params().at(1).String();
  auto textallchat = msg.get_textallchat().Bool();
  return { ent_idx, text };
}

P.s Прошу указать на ошибки в тексте, если таковые есть.
P.p.s Еще нам понадобится
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
4 Фев 2019
Сообщения
56
Реакции[?]
12
Поинты[?]
0
мейби сделать это в exe вместе с клантегом,тупо для хвхшара пак
еу-язык и фейк клан тег скита
 
Начинающий
Статус
Оффлайн
Регистрация
7 Июл 2018
Сообщения
5
Реакции[?]
0
Поинты[?]
0
Суть заключается в том, что вы пишите в чат сообщение , а ваш (или не ваш :roflanEbalo:) чит переводит на нужный язык.
Пример:
Для начала пишем в чат: @ru-en
1 - Язык на котором пишем.
2 - На какой перевести.
После этого можем писать "Привет", а на выходе получим "Hello"

chat_translator.h
C++:
class chat_translator : public singleton<chat_translator> {
public:
  auto client_cmd(const char* cmd, std::string& buf) -> int;
  auto dispatch_user_message(int entity_id, const std::string& msg) -> void;
  auto thread_tick() -> void;
public:
  auto translate(const std::string& text, const std::string& lang) -> std::string;

private:
  std::string lang_me_{""};
  std::string lang_other_{""};

  struct msg_t {
    int entity_id;
    std::string msg;
  };
  std::deque<msg_t> msgs_;
};

enum EChatTranslatorResult {
  ECTR_None,
  ECTR_SetLang,
  ECTR_Translate
};
chat_translator.cpp
C++:
#include "stdafx.h"
#include "chat_translator.h"
#include "json.hpp"
#include <wininet.h>
#pragma comment(lib, "wininet.lib")

auto chat_translator::client_cmd(const char* cmd, std::string& buf) -> int {
  if (auto command = std::string_view(cmd); !command.compare(0, 3, "say") && strstr(cmd, "\"")) {
    auto tmp = std::string(strstr(cmd, "\""));
    auto msg = tmp.substr(1, tmp.size() - 2);

    bool is_say_team = command[3] == '_';
    bool set_lang_local = msg[0] == '@';
    bool set_lang_other = msg[0] == '#';

    if (set_lang_local || set_lang_other) {
      auto lang = msg.substr(1);
      auto& lang_ = set_lang_local ? lang_me_ : lang_other_;
      lang_ = lang;
      char print_msg[255];
      sprintf_s(print_msg, "[Auto - Translator(%s)] %s",
        set_lang_local ? "Me" : "Other",
        lang.empty() ? "disabled" : lang.data());
      chud_chat::get()->printf(print_msg);
      return ECTR_SetLang;
    }
    if (auto translated = translate(msg.data(), lang_me_); !translated.empty()) {
      buf = (is_say_team ? std::string("say_team \"") : std::string("say \"")) + translated + std::string("\"");
      return ECTR_Translate;
    }
  }
  return ECTR_None;
}

auto chat_translator::dispatch_user_message(int entity_id, const std::string& msg) -> void {
  if (lang_other_.empty())
    return;

  if (entity_id != sdk::g_engine_client->get_local_player() - 1) {
    msgs_.push_back(msg_t { entity_id, msg });
  }
}

auto chat_translator::thread_tick() -> void {
  while (!msgs_.empty()) {
    auto msg = msgs_.front();
    msgs_.pop_front();
    if (auto ent = cplayer::get_player(msg.entity_id); ent) {
      if (auto translated = translate(msg.msg, lang_other_); !translated.empty()) {
        auto nick = ent->get_player_info().szName;
        auto team = ent->m_iTeamNum();
        if (team == TEAM_COUNTER_TERRORIST)
          chud_chat::get()->printf(" \x03[%s]: \x0A%s", nick, translated.c_str());
        else if (team == TEAM_TERRORIST)
          chud_chat::get()->printf(" \x09[%s]: \x0A%s", nick, translated.c_str());
      }
    }
  }
}

auto chat_translator::translate(const std::string& text, const std::string& lang) -> std::string {
  // https://github.com/nlohmann/json
  using json = nlohmann::json;
  const std::string url = "https://translate.yandex.net/api/v1.5/tr.json/translate";
  const std::string key = "Ваш апи ключ";

  auto _url = url + std::string("?key=") + key;
       _url += std::string("&text=") + text;
       _url += std::string("&lang=") + lang;

  if (auto connect = InternetOpenA("GoogleChrome", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); connect) {
    if (auto address = InternetOpenUrlA(connect, _url.c_str(), NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0); address) {
      char data_received[1024];
      DWORD number_of_bytes_read = 0;

      if (InternetReadFile(address, data_received, 1024, &number_of_bytes_read) && number_of_bytes_read) {
        std::string output(data_received, number_of_bytes_read);
        InternetCloseHandle(address);
        InternetCloseHandle(connect);

        auto json = json::parse(output.c_str());
        //std::cout << json.dump() << std::endl;
        auto code = json["code"].get<int>();
        if (code == 200)
          return json["text"][0].get<std::string>();
      }
    }
    else {
      InternetCloseHandle(connect);
    }
  }

  return std::string();
}

hooks.cpp
C++:
auto __fastcall hooks::hk_dispatch_user_message(void *thisptr, void*, unsigned int msg_type, unsigned int unk1, unsigned int nBytes, const void *msg_data) -> bool {
  static const auto o_dispatch_user_message = mgr.get_original<dispatch_user_message_fn>("dispatch_user_message");

  if (msg_type == CS_UM_SayText2) {
    auto [entity_id, chat_msg] = protobuffs::parse_chat_message(nBytes, msg_data);
    chat_translator::get().dispatch_user_message(entity_id, chat_msg);
  }
  return o_dispatch_user_message(thisptr, msg_type, unk1, nBytes, msg_data);
}

auto __fastcall  hooks::hk_client_cmd(void* ecx, void*, const char* cmd) -> void {
  static const auto o_client_cmd = mgr.get_original<client_cmd_fn>("client_cmd");

  std::string buf;
  if (auto result = chat_translator::get().client_cmd(cmd, buf); result == ECTR_Translate) {
    return o_client_cmd(ecx, buf.c_str());
  }
  else if (result == ECTR_SetLang) {
    return;
  }

  o_client_cmd(ecx, cmd);
}
Добавить кусок кода в протобаф

C++:
//https://github.com/bananasss00/Protobuff-Parser-Writer

#define CS_UM_SayText2 6

make_struct(CCSUsrMsg_SayText2, 5)
  make_field(ent_idx, 1, TYPE_INT32)
  make_field(chat, 2, TYPE_BOOL)
  make_field(msg_name, 3, TYPE_STRING)
  make_field(params, 4, TYPE_STRING)
  make_field(textallchat, 5, TYPE_BOOL)
};

auto parse_chat_message::parse_chat_message(unsigned int nBytes, const void* msg_data) -> std::tuple<int, std::string> { // return: [entity_id, chat_msg]
  CCSUsrMsg_SayText2 msg((void*)msg_data, nBytes);

  int ent_idx = msg.get_ent_idx().Int32() - 1;
  auto text = msg.getAll_params().at(1).String();
  auto textallchat = msg.get_textallchat().Bool();
  return { ent_idx, text };
}

P.s Прошу указать на ошибки в тексте, если таковые есть.
P.p.s Еще нам понадобится
Пожалуйста, авторизуйтесь для просмотра ссылки.

Пожалуйста, авторизуйтесь для просмотра ссылки.
NICEEEEEEEEEEEEEEEEEEEEEEEEEEE
 
Сверху Снизу