netease-kit / NIM_PC_Demo

云信Windows(PC) C/C++ Demo源码仓库
Other
275 stars 174 forks source link

提交向实现应用服务器post账户密码并接受accid和token的代码,杂乱仅供参考。 #85

Closed yipyeukyi closed 2 years ago

yipyeukyi commented 2 years ago

//第一处需要修改app_sdk_interface.cpp

include "stdafx.h"

include "app_sdk_interface.h"

include "shared/xml_util.h"

include "protocol/sdk_pro.h"

include "base/http/sdk_http_manager.h"

include "app_sdk_config_helper.h"

namespace app_sdk { const std::map<std::string, std::tuple< std::string, NimServerConfType>> key_use_nim_server_conf = { { nim::kNIMAppKey, std::make_tuple("appkey", NimServerConfType::NimServerConfType_String) }, { nim::kNIMUseHttps, std::make_tuple("https_enabled", NimServerConfType::NimServerConfType_Int) }, { nim::kNIMDedicatedClusteFlag, std::make_tuple("dedicated_cluste_flag", NimServerConfType::NimServerConfType_Int) }, { nim::kNIMNegoKeyNECA, std::make_tuple("nego_key_neca", NimServerConfType::NimServerConfType_Int) }, { nim::kNIMCommNECA, std::make_tuple("comm_enca", NimServerConfType::NimServerConfType_Int) }, { nim::kNIMIPProtVersion, std::make_tuple("ip_protocol_version", NimServerConfType::NimServerConfType_Int) },
{ nim::kNIMHandShakeType, std::make_tuple("hand_shake_type", NimServerConfType::NimServerConfType_Int) }, { "NRTCStreamENCType", std::make_tuple("nrtc_stream_enc_type", NimServerConfType::NimServerConfType_Int) }, { "NRTCStreamENCKey", std::make_tuple("nrtc_stream_enc_key", NimServerConfType::NimServerConfType_String) }, { "kNIMChatRoomAddress", std::make_tuple("chatroomDemoListUrl", NimServerConfType::NimServerConfType_String) } }; const std::string AppSDKInterface::kAppKey = "00000000"; //改为自己的appkey const std::string AppSDKInterface::kAppHost = "http://app.netease.im";

std::map<std::string, std::string> AppSDKInterface::configmap; bool AppSDKInterface::HasconfigValue(const std::string& key, bool from_private_setting) { bool ret = false; if (configmap.empty()) { LoadConfig(); } ret = (configmap.find(key) != configmap.end()); if (!ret && from_private_setting) { Json::Value json_value; if (key_use_nim_server_conf.find(key) != key_use_nim_server_conf.end() && nbase::FilePathIsExist(nbase::UTF8ToUTF16(app_sdk::AppSDKConfig::GetInstance()->GetAppConfigPath()), false) && GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value)) { ret = true; } } return ret; } std::string AppSDKInterface::GetConfigValue(const std::string& key) { Json::Value json_value; if (key_use_nim_server_conf.find(key) != key_use_nim_server_conf.end() && nbase::FilePathIsExist(nbase::UTF8ToUTF16(app_sdk::AppSDKConfig::GetInstance()->GetAppConfigPath()), false) && app_sdk::GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value)) { auto it = key_use_nim_server_conf.find(key); return GetConfigStringValueFromNimServerConf(std::get<0>(it->second), std::get<1>(it->second)); }
return GetConfigValueFromMap(key); }
std::string AppSDKInterface::GetConfigValueFromMap(const std::string& key) { if (configmap.empty()) { LoadConfig(); } if (configmap.find(key) != configmap.end()) return configmap[key]; return ""; } int AppSDKInterface::GetConfigFileVersion() { int version = 0; std::string value; std::wstring server_conf_path = QPath::GetAppPath(); server_conf_path.append(L"global_conf.txt"); TiXmlDocument document; if (shared::LoadXmlFromFile(document, server_conf_path)) {

    TiXmlElement* root = document.RootElement();        
    if (root != nullptr)
    {
        if (auto pchar = root->Attribute("kConfVersion"))
        {
            value = pchar;
        }
    }
}
if (!value.empty())
    nbase::StringToInt(value, &version);
return version;

} std::string AppSDKInterface::GetAppKey() { std::string app_key = kAppKey; std::string new_app_key = GetConfigValue(nim::kNIMAppKey); if (!new_app_key.empty()) { app_key = new_app_key; } return app_key; } bool AppSDKInterface::IsNimDemoAppKey(const std::string& appkey) { static const std::string kNimTestAppKey = "fe416640c8e8a72734219e1847ad2547"; if (appkey.compare(kNimTestAppKey) == 0 || appkey.compare(kAppKey) == 0) return true; return false; }

bool AppSDKInterface::IsSafeUrl(const std::string& safe_url) { std::string temp(safe_url); std::string params; std::vector param_list; std::map<std::string, std::string> param_pair_list; auto param_pos = ((temp.find("?") == std::string::npos) ? (0) : (temp.find("?") + strlen("?"))); params = temp.substr(param_pos, temp.length()); nbase::LowerString(params); shared::tools::SplitString(params, "&", param_list); for (auto&it : param_list) { std::vector param_pair; shared::tools::SplitString(it, "=", param_pair); if (param_pair.empty()) continue; param_pair_list.insert(std::make_pair(param_pair.begin(), param_pair.rbegin())); } static const std::string safe_url_param_key = "_im_url"; static const int safe_url_param_value = 0x00000001; if (param_pair_list.find(safe_url_param_key) != param_pair_list.end()) { return (std::atoi(param_pair_list[safe_url_param_key].c_str()) & safe_url_param_value) == safe_url_param_value; } return false; }

std::string AppSDKInterface::GetReferrer() { // 开发者请根据自己实际情况来获取该域名地址 return "http://yunxin_referer"; }

std::string AppSDKInterface::GetAppHost() { return kAppHost; } void AppSDKInterface::InvokeFormatAccountAndPassword(const std::string &username, const std::string &password, const OnFormatAccountAndPasswordCallback& cb) { //如果是云信的demo password会进行md5编码,如果是开发者自己的应用可以引入其它方式 //甚至可以转到开发者自己的应用服务器,拿到真正的accid 与password,可以异步操作,但此时 user相关数据(user目录、image目录以及日志等)并未创建 bool password_use_md5 = IsNimDemoAppKey(GetAppKey()); if (!password_use_md5) password_use_md5 = (HasconfigValue("kNIMPasswordMD5") && (std::atoi(GetConfigValue("kNIMPasswordMD5").c_str()) != 0)); cb(!(username.empty() || password.empty()), username, (password_use_md5 ? password : password)); //去掉md5加密 } void AppSDKInterface::InvokeRegisterAccount(const std::string &username, const std::string &password, const std::string &nickname, const OnRegisterAccountCallback& cb) { //在构造函数中传入请求参数 auto&& req = app_sdk::CreateHttpRequest(username,password,nickname);

SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::RegisterAccountReq, app_sdk_pro::RegisterAccountRsp>(req, 
    ToWeakCallback([cb](const app_sdk_pro::RegisterAccountReq& req, const app_sdk_pro::RegisterAccountRsp& rsp){
    if (cb != nullptr)
    {
        cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->err_msg_);
    }
}));

} void AppSDKInterface::InvokeGetChatroomList(const OnGetChatroomListCallback& cb) { auto&& req = app_sdk::CreateHttpRequest(); SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::GetChatroomListReq, app_sdk_pro::GetChatroomListRsp>(req, ToWeakCallback([cb](const app_sdk_pro::GetChatroomListReq& req, const app_sdk_pro::GetChatroomListRsp& rsp){ if (cb != nullptr) {
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->chatroomlist); }
})); } void AppSDKInterface::InvokeGetChatroomAddress(__int64 room_id, const std::string& uid, int type, const OnGetChatroomAddressCallback& cb) { auto&& req = app_sdk::CreateHttpRequest(); req->roomid = roomid; req->type = type; req->uid_ = uid; SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::GetChatroomAddressReq, app_sdk_pro::GetChatroomAddressRsp>(req, ToWeakCallback([cb](const app_sdk_pro::GetChatroomAddressReq& req, const app_sdkpro::GetChatroomAddressRsp& rsp){ if (cb != nullptr) { cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->address); } })); } void AppSDKInterface::LoadConfig() { configmap.clear(); std::wstring server_conf_path = QPath::GetAppPath(); server_conf_path.append(L"global_conf.txt"); TiXmlDocument document; if (shared::LoadXmlFromFile(document, server_conf_path)) {

    TiXmlElement* root = document.RootElement();
    auto attribute = root->FirstAttribute();
    while (attribute != nullptr)
    {
        config_map_[attribute->Name()] = attribute->ValueStr();
        attribute = attribute->Next();
    }
}
if (config_map_.empty())
{
    config_map_["nim_global_conf_error"] = "nim_global_conf_error";
}

} }

yipyeukyi commented 2 years ago

//第二处修改login_form.cpp

include "login_form.h"

include

include "base/util/string_util.h"

include "gui/main/main_form.h"

include "module/db/public_db.h"

include "module/login/login_manager.h"

include "guiex/main/main_form_ex.h"

include "gui/main/main_form_menu.h"

include "gui/plugins/chatroom_plugin.h"

include "module/plugins/main_plugins_manager.h"

include "gui/plugins/cef_test_plugin.h"

include "gui/plugins/gif_test_plugin.h"

include "module/config/config_helper.h"

include "gui/plugins/addresbook_plugin/addresbook_plugin.h"

include "tool_kits\ui_component\ui_kit\export\nim_ui_runtime_manager.h"

include "gui/proxy/proxy_form.h"

include "nim_app.h"

include "ui_component\ui_kit\util\user.h"

include "third_party\curl\include\curl\curl.h"

include "third_party\jsoncpp\include\json\json.h"

using namespace ui; void LoginForm::OnLogin() { if (use_privatesettings->IsSelected()) { chkbox_private_use_proxyenable->SetEnabled(false); std::string url = private_settingsurl->GetUTF8Text(); if (url.empty()) { ShowMsgBox(this->GetHWND(), MsgboxCallback(), MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_INPUT_PRIVATESETTINGS_URL"), false); chkbox_private_use_proxyenable->SetEnabled(true); return; } nim_http::SetGlobalProxy(NIMProxyType::kNIMProxyNone, "", 0, "", ""); nim_http::HttpRequest req(url, nullptr,0, [this, url](bool ret, int code, const std::string& configs) { Post2UI(this->ToWeakCallback(this,ret,code, configs, url { if (ret && code == nim::kNIMResSuccess) { Json::Value json_config; if (Json::Reader().parse(configs, json_config) && json_config.isObject() && json_config.isMember("version") && json_config.isMember("link")) { ConfigHelper::GetInstance()->UsePrivateSettings(true, url); std::string priavet_setting_path = nbase::UTF16ToUTF8(QPath::GetNimAppDataDir(L"").append(L"nim_private_server.conf")); std::ofstream config(priavet_setting_path, std::ios::out | std::ios::trunc); if (config.is_open()) { config << configs; config.close(); } if (InitSDK(priavet_setting_path)) { nim::Global::SetProxy(nim::NIMProxyType::kNIMProxyNone, "", 0, "", ""); nim_chatroom::ChatRoom::SetProxy(nim_chatroom::kNIMChatRoomProxyNone, "", 0, "", ""); if (chkbox_private_use_proxyenable->IsSelected()) { auto proxy_form = nim_comp::WindowsManager::SingletonShow(ProxyForm::kClassName); proxy_form->AttachBeforClose(this { Post2UI(ToWeakCallback(this { OnLogin_i(); })); }); } else { OnLogin_i(); } }

            }                   
            else
            {
                ShowMsgBox(this->GetHWND(), MsgboxCallback(), 
                    MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_PRIVATESETTINGS_ERROR_A_CHECK"), 
                    false);
                chkbox_private_use_proxy_enable_->SetEnabled(true);
            }                       
        }
        else
        {
            ShowMsgBox(this->GetHWND(), MsgboxCallback(), 
                MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_UNABLE_DOWNLOAD_PRIVATESETTINGS"),
                false);
            chkbox_private_use_proxy_enable_->SetEnabled(true);
        }
    }));

}); nim_http::PostRequest(req); } else { ConfigHelper::GetInstance()->UsePrivateSettings(false); chkbox_private_use_proxyenable->SetEnabled(false); if (InitSDK()) OnLogin_i(); } } void LoginForm::OnLogin_i() { DoInitUiKit(nim_ui::InitManager::kIM); SetAnonymousChatroomVisible(false); DoBeforeLogin(); } bool LoginForm::InitSDK(const std::string& pravate_settings_file_path) { if (!nim_ui::RunTimeDataManager::GetInstance()->IsSDKInited()) { if (!NimAPP::GetInstance()->InitNim(pravate_settings_file_path)) { ShowMsgBox(this->GetHWND(), MsgboxCallback(), MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_SDK_INIT_ERR_CHECK_PRIVATESETTINGS"), false); return false; } } return true; } void LoginForm::DoInitUiKit(nim_ui::InitManager::InitMode mode) { // InitUiKit接口第一个参数决定是否启用事件订阅模块,默认为false,如果是云信demo app则为true // 如果你的App开启了事件订阅功能,则此参数改为true nim_ui::InitManager::GetInstance()->InitUiKit(app_sdk::AppSDKInterface::IsNimDemoAppKey(app_sdk::AppSDKInterface::GetAppKey()), mode); } void LoginForm::DoBeforeLogin() {

//功能直接复制到fight函数

/* std::string username = user_nameedit->GetUTF8Text(); StringHelper::Trim( username ); std::wstring user_name_temp = nbase::UTF8ToUTF16(username); user_name_temp = StringHelper::MakeLowerString(user_name_temp); username = nbase::UTF16ToUTF8(user_nametemp); if( username.empty() ) { usericon->SetEnabled(false); ShowLoginTip(MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_TIP_ACCOUNT_EMPTY")); chkbox_private_use_proxyenable->SetEnabled(true); return; }

std::string password = passwordedit->GetUTF8Text(); StringHelper::Trim( password ); if( password.empty() ) { passwordicon_->SetEnabled(false); ShowLoginTip(MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_TIP_PASSWORD_EMPTY")); chkbox_private_use_proxyenable->SetEnabled(true); return; }
usericon->SetEnabled(true); passwordicon->SetEnabled(true);

*/

int love = 1;

char* mymy[] = {"love"}; fight(love,mymy);

//StartLogin(username, password); }

void LoginForm::DoRegisterAccount() { ConfigHelper::GetInstance()->UsePrivateSettings(false); chkbox_private_use_proxyenable->SetEnabled(false); if (!nim_ui::RunTimeDataManager::GetInstance()->IsSDKInited() && !InitSDK()) return; MutiLanSupport* mls = MutiLanSupport::GetInstance(); std::string username = user_nameedit->GetUTF8Text(); StringHelper::Trim(username); std::string password = passwordedit->GetUTF8Text(); StringHelper::Trim(password); std::string nickname = nick_nameedit->GetUTF8Text(); StringHelper::Trim(nickname); if (password.length() < 6 || password.length() > 128) { ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_PASSWORD_RESTRICT")); } else if (nickname.empty()) { ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_NICKNAME_RESTRICT")); } else { btnregister->SetEnabled(false); btnlogin->SetVisible(false);

password = QString::GetMd5(password);
auto task = ToWeakCallback([this](int res, const std::string& err_msg) {
    if (res == 200)
    {
        register_ok_toast_->SetVisible(true);
        nbase::ThreadManager::PostDelayedTask(ToWeakCallback([this]() {
            register_ok_toast_->SetVisible(false);
        }), nbase::TimeDelta::FromSeconds(2));

        nbase::ThreadManager::PostDelayedTask(ToWeakCallback([this]() {
            SetTaskbarTitle(MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_LOGIN"));
            FindControl(L"enter_panel")->SetBkImage(L"user_password.png");
            FindControl(L"nick_name_panel")->SetVisible(false);
            FindControl(L"enter_login")->SetVisible(false);
            FindControl(L"register_account")->SetVisible(true);
            FindControl(L"login_cache_conf")->SetVisible(true);
            SetAnonymousChatroomVisible(!login_function_);
            btn_register_->SetEnabled(true);
            btn_register_->SetVisible(false);
            btn_login_->SetVisible(true);
        }), nbase::TimeDelta::FromMilliseconds(2500));
    }
    else
    {
        MutiLanSupport* mls = MutiLanSupport::GetInstance();
        if (res == 601) {
            ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_ACCOUNT_RESTRICT"));
        }
        else if (res == 602) {
            ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_ACCOUNT_EXIST"));
        }
        else if (res == 603) {
            ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_NICKNAME_TOO_LONG"));
        }
        else {
            ShowLoginTip(nbase::UTF8ToUTF16(err_msg));
        }
        btn_register_->SetEnabled(true);
    }
});
app_sdk::AppSDKInterface::GetInstance()->InvokeRegisterAccount(username, password, nickname, task);

} }

void LoginForm::StartLogin( std::string username, std::string password ) { if (!nim_ui::LoginManager::GetInstance()->CheckSingletonRun(nbase::UTF8ToUTF16(username))) { ShowMsgBox(this->GetHWND(), MsgboxCallback(), L"STRID_CHECK_SINGLETON_RUN", true); return; }

user_nameedit->SetEnabled(false); passwordedit->SetEnabled(false);

login_errortip->SetVisible(false); login_ingtip->SetVisible(true);

btnlogin->SetVisible(false); btncancel->SetVisible(true);

nim_ui::LoginManager::GetInstance()->DoLogin(username, password); }

void LoginForm::RegLoginManagerCallback() { nim_ui::OnLoginError cb_result = [this](int error){ this->OnLoginError(error); };

nim_ui::OnCancelLogin cb_cancel = [this]{ this->OnCancelLogin(); };

nim_ui::OnHideWindow cb_hide = [this]{ this->ShowWindow(false, false); };

nim_ui::OnDestroyWindow cb_destroy = [this]{ PublicDB::GetInstance()->SaveLoginData(); ::DestroyWindow(this->GetHWND()); };

nim_ui::OnShowMainWindow cb_show_main = [this]{ nim_ui::UIStyle uistyle = nim_ui::UIStyle::join; switch (ConfigHelper::GetInstance()->GetUIStyle()) { case 0: uistyle = nim_ui::UIStyle::conventional; break; case 1: uistyle = nim_ui::UIStyle::join; break; default: break; }

nim_ui::RunTimeDataManager::GetInstance()->SetUIStyle(uistyle);
switch (nim_ui::RunTimeDataManager::GetInstance()->GetUIStyle())
{
case nim_ui::UIStyle::join:
    nim_comp::MainPluginsManager::GetInstance()->RegPlugin<CefTestPlugin>("CefTestPlugin");
    nim_comp::MainPluginsManager::GetInstance()->RegPlugin<ChatroomPlugin>("ChatroomPlugin");
    nim_comp::MainPluginsManager::GetInstance()->RegPlugin<GifTestPlugin>("GifTestPlugin");
    nim_comp::MainPluginsManager::GetInstance()->RegPlugin<AddresBookPlugin>("AddresBookPlugin");
    nim_ui::WindowsManager::SingletonShow<nim_comp::MainFormEx>(nim_comp::MainFormEx::kClassName,new MainFormMenu());
    break;
case nim_ui::UIStyle::conventional:
    nim_ui::WindowsManager::SingletonShow<MainForm>(MainForm::kClassName);
    break;
default:
    break;
}   

};

nim_ui::LoginManager::GetInstance()->RegLoginManagerCallback(ToWeakCallback(cb_result), ToWeakCallback(cb_cancel), ToWeakCallback(cb_hide), ToWeakCallback(cb_destroy), ToWeakCallback(cb_show_main)); }

void LoginForm::OnLoginError( int error ) { if (error == nim::kNIMResSuccess) { OnLoginOK(); } else { OnCancelLogin(); if (use_privatesettings->IsSelected()) chkbox_private_use_proxyenable->SetEnabled(true); MutiLanSupport* mls = MutiLanSupport::GetInstance(); if (error == nim::kNIMResUidPassError) { usericon->SetEnabled(false); passwordicon->SetEnabled(false); ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_PASSWORD_ERROR")); } else if (error == nim::kNIMResConnectionError) { ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_NETWORK_ERROR")); } else if (error == nim::kNIMResExist) { ShowLoginTip(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_LOCATION_CHANGED")); } else { std::wstring tip = nbase::StringPrintf(mls->GetStringViaID(L"STRID_LOGIN_FORM_TIP_ERROR_CODE").c_str(), error); ShowLoginTip(tip); } } }

void LoginForm::OnCancelLogin() { usericon->SetEnabled(true); passwordicon->SetEnabled(true);

user_nameedit->SetEnabled(true); passwordedit->SetEnabled(true);

login_ingtip->SetVisible(false); login_errortip->SetVisible(false);

btnlogin->SetVisible(true); btncancel->SetVisible(false); btncancel->SetEnabled(true); }

void LoginForm::ShowLoginTip(std::wstring tip_text) { auto task = ToWeakCallback(this, tip_text{ login_ingtip->SetVisible(false);

login_error_tip_->SetText(tip_text);
login_error_tip_->SetVisible(true);

}); Post2UI(task); }

void LoginForm::InitLoginData() { PublicDB* manager = PublicDB::GetInstance(); UTF8String user_name = manager->GetLoginData()->username; UTF8String user_password = manager->GetLoginData()->userpassword; bool remember_user = manager->GetLoginData()->rememberuser == 1; bool remember_psw = manager->GetLoginData()->rememberpsw == 1;

if (!user_name.empty() && !user_password.empty()) { if (remember_user) { user_nameedit->SetUTF8Text(user_name); }

if (remember_psw)
{
    password_edit_->SetUTF8Text(user_password);
}

remember_pwd_ckb_->Selected(remember_psw);
remember_user_ckb_->Selected(remember_user);

} else { remember_pwdckb->Selected(false); remember_userckb->Selected(false); } }

void LoginForm::OnLoginOK() { UTF8String user_name = user_nameedit->GetUTF8Text(); UTF8String pass = passwordedit->GetUTF8Text();

PublicDB::GetInstance()->GetLoginData()->status_ = kLoginDataStatusValid; PublicDB::GetInstance()->GetLoginData()->username = user_name; PublicDB::GetInstance()->GetLoginData()->userpassword = pass; PublicDB::GetInstance()->GetLoginData()->rememberpsw = remember_pwdckb->IsSelected() ? 1 : 0; PublicDB::GetInstance()->GetLoginData()->rememberuser = remember_userckb->IsSelected() ? 1 : 0; PublicDB::GetInstance()->SaveLoginData(); nim_http::InitLog(nbase::UTF16ToUTF8(nim_comp::GetUserDataPath().append(L"nim_demo_http.log"))); }

void LoginForm::CheckAutoLogin() { bool pwd_save = remember_pwdckb->IsSelected(); bool autorun_flag = QCommand::Get(L"autorun") == L"1"; QLOG_APP(L"CheckAutoLogin: pwd:{0} autorun:{1}") << pwd_save << autorun_flag; if (pwd_save && autorun_flag) { OnLogin(); }

} bool LoginForm::OnSwitchToLoginPage() { MutiLanSupport* multilan = MutiLanSupport::GetInstance(); SetTaskbarTitle(multilan->GetStringViaID(L"STRID_LOGIN_FORM_LOGIN")); FindControl(L"nick_name_panel")->SetVisible(false); FindControl(L"enter_login")->SetVisible(false); FindControl(L"enter_panel")->SetBkImage(L"user_password.png"); FindControl(L"login_cache_conf")->SetVisible(true); SetAnonymousChatroomVisible(!loginfunction); btnregister->SetVisible(false); btnlogin->SetVisible(); user_nameedit->SetText(L""); user_nameedit->SetPromptText(multilan->GetStringViaID(L"STRID_LOGIN_FORM_ACCOUNT")); passwordedit->SetText(L""); passwordedit->SetPromptText(multilan->GetStringViaID(L"STRID_LOGIN_FORM_PASSWORD")); FindControl(L"register_account")->SetVisible(true); FindControl(L"private_settings")->SetVisible(!loginfunction);

return true; }

size_t LoginForm:: WriteCallback(char contents, size_t size, size_t nmemb, void userp) { ((std::string)userp)->append((char)contents, size nmemb); return size nmemb; }

void LoginForm::fight(int argc, char* argv[]) { //提取数值 std::string username = user_nameedit->GetUTF8Text(); StringHelper::Trim(username); std::wstring user_name_temp = nbase::UTF8ToUTF16(username); user_name_temp = StringHelper::MakeLowerString(user_name_temp); username = nbase::UTF16ToUTF8(user_nametemp); if (username.empty()) { usericon->SetEnabled(false); ShowLoginTip(MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_TIP_ACCOUNT_EMPTY")); chkbox_private_use_proxyenable->SetEnabled(true); return; }

std::string password = passwordedit->GetUTF8Text(); StringHelper::Trim(password); if (password.empty()) { passwordicon_->SetEnabled(false); ShowLoginTip(MutiLanSupport::GetInstance()->GetStringViaID(L"STRID_LOGIN_FORM_TIP_PASSWORD_EMPTY")); chkbox_private_use_proxyenable->SetEnabled(true); return; } usericon->SetEnabled(true); passwordicon->SetEnabled(true); //组装post数据 string posta = "telephone="; string postb = username; string postc = "&password="; string postd = password; string postf = "&sign=000000000000000000000000000000timestamp=1639018036";

string poste = posta + postb + postc + postd + postf; string postz = poste; int postg = postz.length(); string lovelove = "Content-Length:"; string ok = to_string(postg); string bug = lovelove + ok; const char tmp = bug.c_str(); curl_global_init(CURL_GLOBAL_ALL); CURL easyhandle = curl_easy_init(); std::string readBuffer; //设置文件头 struct curl_slist* header_list = NULL; header_list = curl_slist_append(header_list, "User-Agent: okhttp/3.3.1 o"); header_list = curl_slist_append(header_list, "appkey: 000000000000000000000000000"); header_list = curl_slist_append(header_list, "Content-Type: application/x-www-form-urlencoded;"); header_list = curl_slist_append(header_list, "charset=utf-8"); header_list = curl_slist_append(header_list, "Host: 0000000000000000000 "); header_list = curl_slist_append(header_list, "Connection: Keep-Alive"); header_list = curl_slist_append(header_list, "Accept-Encoding: ungzip"); header_list = curl_slist_append(header_list, tmp); curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(easyhandle, CURLOPT_URL, "http://00000000000000000000000000000"); //改为自己的服务器地址 curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, &WriteCallback); curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &readBuffer); curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, poste); curl_easy_perform(easyhandle); std::cout << readBuffer << std::endl; string strValue = readBuffer; Json::Reader reader; Json::Value value; if (reader.parse(strValue, value)) { string out = value["code"].asString();

const Json::Value arrayObj = value["data"];

string love = arrayObj["id"].asString();
string my = arrayObj["token"].asString();

cout << love << endl;
cout << my << endl;
string zusername = love;
string zpassword = my;
StartLogin(zusername, zpassword);
//登录

} }

yipyeukyi commented 2 years ago

//第三处修改文件login_from.h

pragma once

/** @Class LoginForm

@brief 登录窗体

@copyright (c) 2015, NetEase Inc. All rights reserved

@Date 2016/10/12 */ class LoginForm : public nim_comp::WindowEx { public: LoginForm(); ~LoginForm();

//覆盖虚函数 virtual std::wstring GetSkinFolder() override; virtual std::wstring GetSkinFile() override; virtual std::wstring GetWindowClassName() const override; virtual std::wstring GetWindowId() const override; virtual UINT GetClassStyle() const override;

/**

窗口初始化函数 @return void 无返回值 */ virtual void InitWindow() override; /**

拦截并处理底层窗体消息 @param[in] uMsg 消息类型 @param[in] wParam 附加参数 @param[in] lParam 附加参数 @return LRESULT 处理结果 */ virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override; /**

拦截并处理WM_CLOSE消息 @param[in] uMsg 消息类型 @param[in] wParam 附加参数 @param[in] lParam 附加参数 @param[in] lParam 附加参数 @param[in] bHandled 是否处理了消息,如果处理了不继续传递消息 @return LRESULT 处理结果 */ virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); void SetAnonymousChatroomVisible(bool visible); void SetLoginFunctionFlag(){ loginfunction = true; } void SwitchToLoginPage(); private: /**

处理所有控件的所有消息 @param[in] msg 消息的相关信息 @return bool true 继续传递控件消息,false 停止传递控件消息 / bool Notify(ui::EventArgs msg); /**

处理所有控件单击消息 @param[in] msg 消息的相关信息 @return bool true 继续传递控件消息,false 停止传递控件消息 / bool OnClicked(ui::EventArgs msg); /**

注册UIKIT回调函数,让UIKIT控制登录窗体的一些行为 @return void 无返回值 */ void RegLoginManagerCallback(); /**

响应登录结果的回调, @return void 无返回值 */ void OnLoginError(int error); /**

响应取消登录的回调,重置界面控件效果 @return void 无返回值 */ void OnCancelLogin(); private: /**

/**

/**

/**

private: void InitLoginData(); void OnLogin(); void OnLogin_i(); bool InitSDK(const std::string& pravate_settings_file_path = ""); void CheckAutoLogin(); bool OnSwitchToLoginPage(); static size_t WriteCallback(char contents, size_t size, size_t nmemb, void userp); void fight(int argc, char argv[]); public: static const LPCTSTR kClassName; bool loginfunction; bool anonymous_chatroomlogin; private: ui::Control usericon; ui::Control* passwordicon; ui::RichEdit user_nameedit; ui::RichEdit nick_nameedit; ui::RichEdit passwordedit; ui::Control login_ingtip; ui::Label login_errortip; ui::Label register_oktoast; ui::Button btnlogin; ui::Button btnregister; ui::Button btncancel; ui::CheckBox remember_pwdckb = nullptr; ui::CheckBox remember_userckb = nullptr; ui::CheckBox use_privatesettings; ui::CheckBox chkbox_private_use_proxyenable; ui::RichEdit private_settingsurl;

UnregisterCallback sdk_init_autounregcb; }; //以上三部分实现登录,jsoncpp处理服务器返回的格式提取accidd和token可能需要自己调试,我是针对一个比较流行的后台设计的,下面的部分实现搜索应用id寻找用户accid添加好友

yipyeukyi commented 2 years ago

//第四处修改文件add_friend_wnd.cpp

include "add_friend_wnd.h"

include "add_friend_wnd.h"

include "util/windows_manager.h"

include "shared/ui/msgbox.h"

include "module/login/login_manager.h"

include "module/session/session_manager.h"

include "third_party\curl\include\curl\curl.h"

include "third_party\jsoncpp\include\json\json.h"

using namespace ui; using namespace std; namespace nim_comp { const LPCTSTR AddFriendWindow::kClassName = L"AddFriendWindow";

AddFriendWindow::AddFriendWindow() : id_(), searchkey(nullptr), applywords(nullptr), tablayout_(nullptr), addfriend_orchat(nullptr), dakey(false) {

}

AddFriendWindow::~AddFriendWindow() { }

wstring AddFriendWindow::GetSkinFolder() { return L"add_friend"; }

wstring AddFriendWindow::GetSkinFile() { return L"add_friend_wnd.xml"; }

void AddFriendWindow::InitWindow() { tablayout_ = static_cast<TabBox*>(FindControl(_T("tablayout")));

//search_page VBox search_page = static_cast<VBox>(FindControl(g_ADDFRIEND_SEARCH_PAGE)); Button confirm = static_cast<Button>(search_page->FindSubControl(L"confirm")); confirm->AttachClick(nbase::Bind(&AddFriendWindow::Search, this, std::placeholders::_1));

Button cancel = static_cast<Button>(search_page->FindSubControl(L"cancel")); cancel->AttachClick(nbase::Bind(&AddFriendWindow::Cancel, this, std::placeholders::_1));

searchkey = (RichEdit*) search_page->FindSubControl(L"search_key"); searchkey->AttachSetFocus(nbase::Bind(&AddFriendWindow::OnSearchKeyEditSetFocus, this, std::placeholders::_1)); searchkey->SetFocus();

//userinfo_page VBox userinfo_page = static_cast<VBox>(FindControl(_T("userinfopage"))); headimage = (Button)userinfo_page->FindSubControl(L"headimage"); nickname = (Label)userinfo_page->FindSubControl(L"nick_name"); Button userinfo_page_pre_step = (Button)userinfo_page->FindSubControl(L"pre_step"); userinfo_page_pre_step->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SendApplyEdit)); addfriend_orchat = (TabBox)userinfo_page->FindSubControl(L"addfriend_or_chat"); userinfo_page_addfriend = (Button)userinfo_page->FindSubControl(L"add_friend"); userinfo_page_addfriend->AttachClick(nbase::Bind(&AddFriendWindow::AddFriendClick, this, std::placeholders::_1)); Button userinfo_page_chat = (Button)userinfo_page->FindSubControl(L"chat"); userinfo_page_chat->AttachClick(nbase::Bind(&AddFriendWindow::ChatClick, this, std::placeholders::_1)); Button remove_form_black = (Button)userinfo_page->FindSubControl(L"remove"); remove_form_black->AttachClick(nbase::Bind(&AddFriendWindow::RemoveFromBlack, this, std::placeholders::_1));

//notfound_page VBox notfound_page = static_cast<VBox>(FindControl(_T("notfound_page"))); Button notfound_page_continue_search = (Button)notfound_page->FindSubControl(L"continue_search"); notfound_page_continue_search->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit)); Button notfound_page_ok = (Button)notfound_page->FindSubControl(L"ok"); notfound_page_ok->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, L"", NONE));

//send_friend_apply_page VBox send_friend_apply_page = static_cast<VBox>(FindControl(_T("send_friend_apply_page"))); Button send_friend_apply_page_pre_step = (Button)send_friend_apply_page->FindSubControl(L"pre_step"); send_friend_apply_page_pre_step->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_USERINFO_PAGE, NONE)); Button send_friend_apply_page_send = (Button)send_friend_apply_page->FindSubControl(L"send"); send_friend_apply_page_send->AttachClick(nbase::Bind(&AddFriendWindow::SendFriendApplyClick, this, std::placeholders::_1)); applywords = static_cast<RichEdit*>(FindControl(_T("apply_words")));

applywords->SetLimitText( 64 ); //readme 21754 以安卓为准

//send_complete_page VBox send_complete_page = static_cast<VBox>(FindControl(_T("send_complete_page"))); Button send_complete_page_continue_search = (Button)send_complete_page->FindSubControl(L"continue_search"); send_complete_page_continue_search->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit)); Button send_complete_page_ok = (Button)send_complete_page->FindSubControl(L"ok"); send_complete_page_ok->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, L"", NONE));

//send_too_frequent_page VBox send_too_frequent_page = static_cast<VBox>(FindControl(_T("send_too_frequent_page"))); Button send_too_frequent_page_continue_search = (Button)send_too_frequent_page->FindSubControl(L"continue_search"); send_too_frequent_page_continue_search->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit)); Button send_too_frequent_page_ok = (Button)send_too_frequent_page->FindSubControl(L"ok"); send_too_frequent_page_ok->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, L"", NONE));

//add_success_page VBox add_success_page = static_cast<VBox>(FindControl(_T("add_success_page"))); Button add_success_page_continue_search = (Button)add_success_page->FindSubControl(L"continue_search"); add_success_page_continue_search->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit)); Button add_success_page_ok = (Button)add_success_page->FindSubControl(L"ok"); add_success_page_ok->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, L"", NONE));

// net_abnormal_page VBox net_abnormal_page = static_cast<VBox>(FindControl(L"net_abnormal")); Button net_abnormal_page_continue_search = (Button)net_abnormal_page->FindSubControl(L"continue_search"); net_abnormal_page_continue_search->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit)); Button net_abnormal_page_ok = (Button)net_abnormal_page->FindSubControl(L"ok"); net_abnormal_page_ok->AttachClick(nbase::Bind(&AddFriendWindow::PreOrNextClick, this, std::placeholders::_1, L"", NONE));

auto user_info_change_cb = nbase::Bind(&AddFriendWindow::OnUserInfoChange, this, std::placeholders::_1); unregister_cb.Add(UserService::GetInstance()->RegUserInfoChange(user_info_change_cb)); auto user_photo_ready_cb = nbase::Bind(&AddFriendWindow::OnUserPhotoReady, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); unregister_cb.Add(PhotoService::GetInstance()->RegPhotoReady(user_photo_ready_cb)); }

LRESULT AddFriendWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_KEYDOWN) { if (wParam == VK_ESCAPE) { Close(); return 1; } else if (wParam == VK_RETURN) { std::wstring pagename = tablayout->GetItemAt(tablayout_->GetCurSel())->GetName(); if (page_name == g_ADDFRIEND_SEARCH_PAGE) { Search(NULL); } else if (page_name == g_ADDFRIEND_USERINFO_PAGE) { if (addfriend_orchat->GetCurSel() == 0) AddFriendClick(NULL); if (addfriend_orchat->GetCurSel() == 1) ChatClick(NULL); else if (addfriend_orchat->GetCurSel() == 2) RemoveFromBlack(NULL); } else if (page_name == g_ADDFRIEND_NOTFOUND_PAGE) { PreOrNextClick(NULL, g_ADDFRIEND_SEARCH_PAGE, SearchAndSendApplyEdit); } else if (page_name == g_ADDFRIEND_SENDFRIENDAPPLY_PAGE) { SendFriendApplyClick(NULL); } else if (page_name == g_ADDFRIEND_SENDCOMPLETE_PAGE) { PreOrNextClick(NULL, L"", NONE); } else if (page_name == g_ADDFRIEND_SENDTOOFREQUENT_PAGE) { PreOrNextClick(NULL, L"", NONE); } else if (page_name == g_ADDFRIEND_ADDSUCCESS_PAGE) { PreOrNextClick(NULL, L"", NONE); } } }

return __super::HandleMessage(uMsg, wParam, lParam); }

bool AddFriendWindow::Search(ui::EventArgs* param) {

UTF8String key = searchkey->GetUTF8Text();

string pposta = "account="; string ppostb = key;

string ppostf = "&sign=0000000000000000000000&timestamp=1639018036"; string pposte = pposta + ppostb + ppostf; string ppostz = pposte; int ppostg = ppostz.length(); string lovelove = "Content-Length:"; string ook = to_string(ppostg); string bbug = lovelove + ook; const char tmp = bbug.c_str(); curl_global_init(CURL_GLOBAL_ALL); CURL easyhandle = curl_easy_init(); std::string readBuffer; struct curl_slist* header_list = NULL; header_list = curl_slist_append(header_list, "User-Agent: okhttp/3.3.1 o"); header_list = curl_slist_append(header_list, "appkey: 00000000000000000000000000"); header_list = curl_slist_append(header_list, "auth: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ3eCIsImF1ZCI6ImltX2FwcCIsImlhdCI6MTYzOTYzODg1NiwibmJmIjoxNjM5NjM4ODU2LCJleHAiOjE2NTUxOTA4NTYsInVpZCI6MzQxNjUyOTEsIm5hbWUiOiJydWJ5cm9zZSJ9.73HelPtBzX6RFz7k-RpacloXyhkgWmvtkHp___qyauY"); header_list = curl_slist_append(header_list, "Content-Type: application/x-www-form-urlencoded;"); header_list = curl_slist_append(header_list, "charset=utf-8"); header_list = curl_slist_append(header_list, "Host: 00000000000000 "); header_list = curl_slist_append(header_list, "Connection: Keep-Alive"); header_list = curl_slist_append(header_list, "Accept-Encoding: ungzip"); header_list = curl_slist_append(header_list, tmp); curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, header_list); curl_easy_setopt(easyhandle, CURLOPT_URL, "http://000000000000000000000000"); //修改为自己的后台地址 curl_easy_setopt(easyhandle, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, &WriteCallback); curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &readBuffer); curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, pposte); curl_easy_perform(easyhandle); std::cout << readBuffer << std::endl; string strValue = readBuffer; Json::Reader reader; Json::Value value; if (reader.parse(strValue, value)) { string out = value["code"].asString();

const Json::Value arrayObj = value["data"];
string llove = arrayObj["uid"].asString();

cout << llove << endl;

string mykey = llove;

string key = mykey;
nbase::StringTrim(key);

if (key.empty())
    return false;

nim::User::GetUserNameCardCallback cb = ToWeakCallback([this](const std::list<nim::UserNameCard> uinfos) {
    assert(nbase::MessageLoop::current()->ToUIMessageLoop());
    if (!uinfos.empty())
        InitUserProfile(*uinfos.cbegin());
    else
        PreOrNextClick(NULL, g_ADDFRIEND_NOTFOUND_PAGE, AddFriendWindow::NONE);

    SetFocus(nullptr);
    });
nim::User::GetUserNameCardOnline(std::list<std::string>(1, key), cb); //直接从服务器搜索

return true;

} }

bool AddFriendWindow::Cancel(ui::EventArgs* param) { Close(); return true; }

void AddFriendWindow::InitUserProfile(const nim::UserNameCard& uinfo) { id_ = uinfo.GetAccId();

if (LoginManager::GetInstance()->IsEqual(id_)) { userinfo_page_addfriend->SetEnabled(false); } else userinfo_page_addfriend->SetEnabled(true);

tablayout_->SelectItem(g_ADDFRIEND_USERINFO_PAGE);

headimage_->SetBkImage(PhotoService::GetInstance()->GetUserPhoto(uinfo.GetAccId())); nickname->SetText(UserService::GetInstance()->GetUserName(id, false)); ((Label*)FindControl(L"id"))->SetUTF8Text(id);

nim::NIMFriendFlag usertype = UserService::GetInstance()->GetUserType(id); if (MuteBlackService::GetInstance()->IsInBlackList(id_)) addfriend_orchat->SelectItem(2); else if (user_type == nim::kNIMFriendFlagNotFriend) addfriend_orchat->SelectItem(0); else if (user_type == nim::kNIMFriendFlagNormal) addfriend_orchat->SelectItem(1); }

void AddFriendWindow::InitEdit() { searchkey->SetText(L""); applywords->SetText(L""); }

bool AddFriendWindow::PreOrNextClick(ui::EventArgs* param, const std::wstring& page_name, INIT_TYPE init_edit) { if (page_name.empty()) { Close(); } else { if (init_edit == SearchAndSendApplyEdit) { InitEdit(); } else if (init_edit == SendApplyEdit) { applywords->SetText(L""); } tablayout_->SelectItem(page_name);

if (page_name == g_ADDFRIEND_SEARCH_PAGE) {
    search_key_->SetFocus();
}
else if (page_name == g_ADDFRIEND_SENDFRIENDAPPLY_PAGE) {
    apply_words_->SetFocus();
}

}

return true; }

bool AddFriendWindow::AddFriendClick(ui::EventArgs* param) { if (!FindControl(L"add_friend")->IsEnabled()) { return true; }

nim::Friend::Request(id_, nim::kNIMVerifyTypeAdd, "", ToWeakCallback([this](int res_code) { if (res_code == 200) { PreOrNextClick(NULL, g_ADDFRIEND_ADDSUCCESS_PAGE, AddFriendWindow::NONE); } else if(res_code == 408 || res_code == 415){ PreOrNextClick(NULL, g_ADDFRIEND_NET_ABNORMAL_PAGE, AddFriendWindow::NONE); } else{

}

})); return true; }

bool AddFriendWindow::ChatClick(ui::EventArgs* param) { SessionManager::GetInstance()->OpenSessionBox(id_, nim::NIMSessionType::kNIMSessionTypeP2P); Close(); return true; }

bool AddFriendWindow::RemoveFromBlack(ui::EventArgs* args) { nim::User::SetBlackCallback cb = ToWeakCallback([this](int res_code, const std::string& accid, bool opt){ if (rescode == 200) { if (UserService::GetInstance()->GetUserType(id) == nim::kNIMFriendFlagNormal) addfriend_orchat->SelectItem(1); else addfriend_orchat->SelectItem(0); } else if (res_code == 408 || res_code == 415) PreOrNextClick(NULL, g_ADDFRIEND_NET_ABNORMALPAGE, AddFriendWindow::NONE); }); nim::User::SetBlack(id, false, cb); return true; }

bool AddFriendWindow::SendFriendApplyClick(ui::EventArgs* param) { SetFocus(nullptr); return true; }

bool AddFriendWindow::OnSearchKeyEditSetFocus(void* param) { if (!dakey) { dakey = true; } return true; }

void nimcomp::AddFriendWindow::OnUserInfoChange(const std::listnim::UserNameCard& uinfos) { for (const auto &info : uinfos) { if (info.GetAccId() == id) { if (info.ExistValue(nim::kUserNameCardKeyName)) nickname->SetText(UserService::GetInstance()->GetUserName(info.GetAccId(), false)); if (info.ExistValue(nim::kUserNameCardKeyIconUrl)) headimage_->SetBkImage(PhotoService::GetInstance()->GetUserPhoto(info.GetAccId()));

    return;
}

} }

void nim_comp::AddFriendWindow::OnUserPhotoReady(PhotoType type, const std::string & account, const std::wstring & photopath) { if (type == kUser && id == account) { headimage_->SetBkImage(photo_path); } }

} size_t nim_comp::WriteCallback(char contents, size_t size, size_t nmemb, void userp) { ((std::string)userp)->append((char)contents, size nmemb); return size nmemb; }

yipyeukyi commented 2 years ago

//第五处修改add_friend_wnd.h // Copyright (c) 2013, NetEase Inc. All rights reserved. // // Author: pqk // Date: 2013/8/14

pragma once

include "util/window_ex.h"

include "module/service/photo_service.h"

namespace nim_comp { const LPCTSTR g_ADDFRIEND_SEARCH_PAGE = L"search_page"; const LPCTSTR g_ADDFRIEND_USERINFO_PAGE = L"userinfo_page"; const LPCTSTR g_ADDFRIEND_NOTFOUND_PAGE = L"notfound_page"; const LPCTSTR g_ADDFRIEND_SENDFRIENDAPPLY_PAGE = L"send_friend_apply_page"; const LPCTSTR g_ADDFRIEND_SENDCOMPLETE_PAGE = L"send_complete_page"; const LPCTSTR g_ADDFRIEND_SENDTOOFREQUENT_PAGE = L"send_too_frequent_page"; const LPCTSTR g_ADDFRIEND_ADDSUCCESS_PAGE = L"add_success_page"; const LPCTSTR g_ADDFRIEND_NET_ABNORMAL_PAGE = L"net_abnormal";

/** @Class AddFriendWindow

@brief 添加好友窗口

@copyright (c) 2016, NetEase Inc. All rights reserved

@author pqk

@Date 2016/09/19 */ class AddFriendWindow : public WindowEx { public: AddFriendWindow(); virtual ~AddFriendWindow();

//覆盖虚函数 virtual std::wstring GetSkinFolder() override; virtual std::wstring GetSkinFile() override; virtual std::wstring GetWindowClassName() const override { return kClassName; }; virtual std::wstring GetWindowId() const override { return kClassName; }; virtual UINT GetClassStyle() const override { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };

/**

窗口初始化函数 @return void 无返回值 */ virtual void InitWindow() override; /**

拦截并处理底层窗体消息 @param[in] uMsg 消息类型 @param[in] wParam 附加参数 @param[in] lParam 附加参数 @return LRESULT 处理结果 */ virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); private: /**

/**

/**

/**

enum INIT_TYPE { NONE, SearchAndSendApplyEdit, SendApplyEdit, };

/**

private: /**

/**

/**

/**

/**

/**

/**

private: UTF8String id_; bool dakey; AutoUnregister unregister_cb;

}; size_t WriteCallback(char contents, size_t size, size_t nmemb, void userp); void hellohello(int argc, char* argv[]); }

nmgwddj commented 2 years ago

感谢完善我们没有考虑到的内容。有些建议希望您能参考: