using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Threading; using Sog; using System.Net.Http; using LitJson; using SimpleHttpServer; using ProtoCSStruct; using System.Reflection; using System.Dynamic; using Sog.Crypto; using System.Web; using System.Text.Json; using System.Text; namespace Operation { public class hero { public int id { get; set; } public string name { get; set; } public int race { get; set; } } public class myRoleData { public string role_name; public string cpUid; // 确认一下输入的服务器Id,和实际查询到的服务器id不同,是否成功返回 public string server_id; public string cpExt; public string cUid; public string cid; } public class UidRelm { public int uid; public int realmId; } [MenuMapping(refc = typeof(PlayerInfoOp))] public class SelectRole { public static int OnSelectHerosHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { TraceLog.Trace("SelectRole.OnSelectHerosHttpReq Url{0},param count {1}", request.Url, query.Count); JsonData msgdata = new JsonData(); jsonData["data"] = msgdata; msgdata.Add(""); msgdata.Clear(); return 0; } [RequestMapping("hero_skin",PermissionCode.SELECT_HERO_SKIN)] public static int OnSelectHeroSkinHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { TraceLog.Trace("SelectRole.OnSelectHeroSkinHttpReq Url{0},param count {1}", request.Url, query.Count); JsonData msgdata = new JsonData(); jsonData["data"] = msgdata; msgdata.Add(""); msgdata.Clear(); return 0; } private static void GetResData(Dictionary man, FieldInfo[] fieldInfos, object res) { //dynamic obj =new ExpandoObject(); foreach (var Fd in fieldInfos) { if (Fd.Name.StartsWith("Repeated") || Fd.Name == "FixedElementField") { continue; } if (Fd.FieldType.IsArray) { continue; } //基础类型直接写入值 if (Fd.FieldType.IsPrimitive) { if (!man.ContainsKey(Fd.Name)) { man.Add(Fd.Name, Fd.GetValue(res)); } } else { // ProtoCSStruct.RepeatedDBIDValue_32 +< Buffer > e__FixedBuffer.FixedElementField var vla = res.GetType().GetField(Fd.Name).GetValue(res); //字符类型获取字符写入 if (Fd.FieldType == typeof(FixedStructString32) || Fd.FieldType == typeof(FixedStructString16)) { man.Add(Fd.Name, Fd.FieldType.GetMethod("GetString").Invoke(vla, null)); } //自定义结构继续递归 else { var sss = new Dictionary(); GetResData(sss, Fd.FieldType.GetFields(), vla); man.Add(Fd.Name, sss); } } } } //收到回包时调用这个 public static void OnResMsg(uint id, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSGmQueryUserRoletInfoRes res) { if(res.RoleBase.Uid == 0) { jsondata["msg"] = "failed!"; jsondata["code"] = -1; return; } JsonData rdata = new JsonData(); rdata["role_id"] = res.RoleBase.Uid; rdata["role_name"] = res.RoleBase.Nick.GetString(); rdata["uid"] = res.RoleBase.Uid; rdata["server_id"] = 0; rdata["register_time"] = res.RoleBase.CreateTime; rdata["last_login_time"] = res.RoleBase.LastLoginTime; rdata["level"] = res.RoleBase.Level; rdata["vip_level"] = res.RoleBase.VipLevel; rdata["total_pay"] = res.RoleData.PayData.TotalPayMoney; int ban_type = 0; if (res.FreezeTime > 0) { ban_type = 1; } rdata["ban_type"] = ban_type; rdata["ban_time"] = res.FreezeTime; rdata["ban_reason"] = (int)res.FreezeReason; jsondata["msg"] = "success"; jsondata["code"] = 0; jsondata["data"] = rdata; //jsondata["Arena"] = res.RoleData.Arena.ArenaBaseList.ToString(); //jsondata["Data"] = res.ToString(); rsp.IsWaitFor = false; return; } public static int DoSelect(JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint id) { TraceLog.Trace("SelectRole.DoSelect Url{0},param count {1}", request.Url, query.Count); SSGmQueryUserRoleInfoReq req = new SSGmQueryUserRoleInfoReq(); int uid = query.GetValue("uid").Toint32(0); req.ReqType = 1; if (0 != query.GetValue("identifier").Toint32(0) && uid == 0) { uid = query.GetValue("identifier").Toint32(0); req.ReqType = 0; } req.Id = id; req.Uid = (uint)uid; req.AccountType = 0; //发送消息 OperationServerUtils.SendToWorld((int)SSGameMsgID.GmQueryUserRoleReq, ref req, uid, 0, ""); rsp.IsWaitFor = true; return 0; } [RequestMapping("角色信息查询", PermissionCode.SELECT_ROLE, true, ignored: true)] public static int OnSelectRoleHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { try { DoSelect(jsonData, rsp, request, query, httpContextId); } catch (Exception ex) { TraceLog.Error("SelectRole.ProccessRequest Error Msg {0}", ex.Message); } return 0; } public static int OnSelectRoleApiHttpReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { try { DoSelect(jsonData, rsp, request, query, httpContextId); } catch (Exception ex) { TraceLog.Error("SelectRole.ProccessRequest Error Msg {0}", ex.Message); } return 0; } public static int OnSelectRoleHeroHttpReq(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)//, HttpContext httpContext) { TraceLog.Trace("SelectRole.OnSelectRoleHeroHttpReq Url{0},param count {1}", request.Url, query.Count); string sign = query.GetValue("sign"); string reqData = HttpUtility.UrlDecode(query.GetValue("data")); var allParams = new Dictionary(); foreach (var item in query.m_map) { if (item.Key != "sign") { allParams[item.Key] = HttpUtility.UrlDecode(item.Value); } } // 校验签名 string appKey = OperationServerUtils.GetServerConfig().heroAppKey; string calcSign = HeroUSDKSecurity.CalcSign(appKey, allParams); if (calcSign != sign) { TraceLog.Error("SelectRole.OnSelectRoleHeroHttpReq sign not same, calc {0} req {1}", calcSign, sign); jsondata["msg"] = "签名校验错误!"; jsondata["code"] = -1; return -1; } byte[] tmp = Convert.FromBase64String(reqData); var reqDataStr = Encoding.UTF8.GetString(tmp); TraceLog.Trace("SelectRole.OnSelectRoleHeroHttpReq :{0}", reqDataStr); JsonData reqDataJson = JsonMapper.ToObject(reqDataStr); int uid = reqDataJson["role_id"].ToString().Toint32(0); int realmId = reqDataJson["server_id"].ToString().Toint32(0); //int uid = query.GetValue("role_id").ToString().Toint32(0); //int realmId = query.GetValue("server_id").ToString().Toint32(0); TraceLog.Trace("SelectRole.OnSelectRoleHeroHttpReq - uid: {0},realmId: {1}", uid, realmId); if (uid <= 0 || realmId <= 0) { jsondata["msg"] = "请求参数错误!"; jsondata["code"] = 1; return 1; } //TODO //httpContext.callbackArgs = new UidRelm { uid = uid, realmId =realmId }; SSGmQueryUserAccountInfoReq reqAc = new SSGmQueryUserAccountInfoReq(); reqAc.Id = httpContextId; reqAc.ReqType = 1; reqAc.Account.SetString(uid.ToString()); OperationServerUtils.SendToDBServer((int)SSGameMsgID.GmQueryUserAccountinfoReq, ref reqAc, 0, 0); rsp.IsWaitFor = true; return 0; } public static void OnResMsgHero(uint id, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSGmQueryUserAccountInfoRes res, object callBackArgs) { if (string.IsNullOrEmpty( res.AccountId.GetString())) { TraceLog.Error("SelectRole.OnResMsgHero res.AccountId is null! "); jsondata["msg"] = "未查询到角色!"; jsondata["code"] = -1; rsp.IsWaitFor = false; return; } jsondata["msg"] = "success"; List RoleList = new List(); if (res.RoleList.Count == 0) { jsondata["msg"] = "未查询到角色!"; jsondata["code"] = 1; rsp.IsWaitFor = false; return; } int myUid = 0; int myRealm = 0; try { UidRelm myuidRealm = callBackArgs as UidRelm; myUid = myuidRealm.uid; myRealm = myuidRealm.realmId; } catch (Exception ex) { TraceLog.Error("SelectRole.OnResMsgHero callBackArgs as UidRelm error:{0}! ", ex.Message); jsondata["msg"] = "查询角色失败!"; jsondata["code"] = -1; rsp.IsWaitFor = false; return; } bool isTrue = true; for (int i = 0; i < res.RoleList.Count; i++) { var Role = res.RoleList.Get(i); if(myUid != Role.Uid || myRealm != Role.Realm) { // 这里查询结果只会又一个,所以break没问题的 isTrue = false; break; } var roleItem = new myRoleData(); roleItem.server_id = Role.Realm.ToString(); roleItem.cpUid = Role.Uid.ToString(); roleItem.role_name = Role.Nick.GetString(); roleItem.cpExt = GetcpExt((int)Role.Realm); roleItem.cUid = res.AccountId.GetString(); if(res.ChannelId != 0) { roleItem.cid = res.ChannelId.ToString(); } else { roleItem.cid = ""; } RoleList.Add(roleItem); } if (!isTrue) { jsondata["msg"] = "角色Id与服务器Id不匹配!"; jsondata["code"] = 2; rsp.IsWaitFor = false; return; } jsondata["data"] = JsonConfig.stringify(RoleList); TraceLog.Trace("SelectRole.OnResMsgHero param {1}", jsondata["data"]); jsondata["code"] = 0; rsp.IsWaitFor = false; return; } public static string GetcpExt(int realmId) { var allRealm = OperationServerUtils.GetOperationServerData().m_allRealm.Values.ToList(); int wordId = 0; foreach (var realm in allRealm) { if (realm.realmId == realmId) { wordId = realm.WorldId; break; } } var msg = new HeroPayCpCustomMsg(); msg.worldId = wordId; string json = JsonSerializer.Serialize(msg); string cpExt = Convert.ToBase64String(Encoding.ASCII.GetBytes(json)); return cpExt; } public static void OnResMsgParse(uint id, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSGmQueryUserRoletInfoRes res) { if (res.RoleBase.Uid == 0) { TraceLog.Error("SelectRole.OnResMsgHero res.RoleBase.uid == 0! "); jsondata["msg"] = "未查询到角色!"; jsondata["code"] = -1; return; } jsondata["RoleBase"] = res.RoleBase.ToString(); JsonData currencyData = new JsonData(); currencyData["Chip"] = res.RoleBase.Chip; currencyData["Diamond"] = res.RoleBase.Diamond; currencyData["HeroExp"] = res.RoleBase.HeroExpPool; currencyData["VipExp"] = res.RoleBase.VipExp; jsondata["Currency"] = currencyData; JsonData rdata = new JsonData(); rdata["role_name"] = res.RoleBase.Nick.GetString(); rdata["server_id"] = res.DbRealmId; rdata["cpUid"] = res.RoleBase.Uid; jsondata["msg"] = "success"; jsondata["code"] = 0; jsondata["data"] = rdata; rsp.IsWaitFor = false; return; } } }