using CommonLang; using CommonLang.Concurrent; using CommonLang.IO; using CommonLang.Property; using CommonNetwork.Http; using pomelo.chat; using SimpleJson; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace XmdsBattleClientBot.Bot { partial class BotClient { public ChatManager CurrentChatManager { get; private set; } public GetChatServerIdResponse LastGetChatServerIdResponse { get; private set; } /// /// 0综合,1世界,2区域,3交易,4公会,5队伍,6系统,7喇叭,8私聊 /// public enum ChatChannel { [Desc("世界")] WORLD = 1, // 世界 [Desc("公会")] SOCIETY = 2, // 公会 [Desc("队伍")] GROUPS = 3, // 队伍 [Desc("私聊")] PRIVATE = 4, // 私聊 [Desc("连服")] ZONE = 5, // 连服(跨服) [Desc("附近")] NEARBY = 6, // 附近 [Desc("喇叭")] HORM = 8 // 喇叭 } public enum ChatAt { Normal = 0, All = 1, Single = 2, } public enum ChatFunType { NA = 0, Roll = 1, } public void chat_SendChat(Action callback, string content, string titleMsg = "", ChatChannel ch = ChatChannel.WORLD, string acceptRoleId = "", ChatAt at = ChatAt.Normal, ChatFunType funtype = ChatFunType.NA) { dynamic input = new { s2c_name = this.PlayerData.name,//DataMgr.Instance.UserData.Name s2c_level = this.PlayerData.level, // DataMgr.Instance.UserData:TryToGetIntAttribute(UserData.NotiFyStatus.LEVEL, 0); s2c_pro = this.PlayerData.pro,// DataMgr.Instance.UserData.Pro; s2c_zoneId = this.PlayerData.zoneId,//DataMgr.Instance.UserData:GetAttribute(UserData.NotiFyStatus.ZONEID); s2c_vip = this.PlayerData.vip,// DataMgr.Instance.UserData:GetAttribute(UserData.NotiFyStatus.VIP); s2c_isAtAll = (int)at, s2c_titleMsg = titleMsg, s2c_funtype = (int)funtype, s2c_color = (uint)0xFFFFFFFF, acceptRoleId = acceptRoleId, }; string msg = SimpleJson.SimpleJson.SerializeObject(input); new ChatManager.ChatRequest(this) { channel = ch, chatContent = content, acceptRoleId = acceptRoleId, serverData = msg, }.Send(callback); } public virtual string FormatChat(OnChatPush push) { StringBuilder sb = new StringBuilder(); var ch = (BotClient.ChatChannel)push.s2c_scope; var desc = PropertyUtil.GetEnumAttribute(ch); dynamic input = SimpleJson.SimpleJson.DeserializeObject(push.s2c_serverData); sb.Append(push.s2c_time); sb.Append(" "); sb.Append(string.Format("[{0}]", desc.Desc)); try { sb.Append(string.Format("{0}(Lv{1})", input["s2c_name"], input["s2c_level"])); string s2c_titleMsg = input["s2c_titleMsg"]; if (!string.IsNullOrEmpty(s2c_titleMsg)) { sb.Append(string.Format(":\"{0}\"", s2c_titleMsg)); } } catch (Exception err) { sb.Append(err.Message); } sb.Append(": " + push.s2c_content); return sb.ToString(); } public class ChatManager { public ChatManager(BotClient bot) { bot.client.GameSocket.chatHandler.getChatServerIdRequest((err, rsp) => { bot.LastGetChatServerIdResponse = rsp; }); } public class ChatRequest { private readonly BotClient bot; public static string BOUNDARY = "---------------------------123821742118716"; //boundary就是request头和上传文件内容的分隔符 public ChatChannel channel = ChatChannel.WORLD; public string chatContent = "0"; public string acceptRoleId = "1"; public string serverData = "0"; public string chatType = "1";//0 is sound public bool Result { get; private set; } public ChatRequest(BotClient bot) { this.bot = bot; } public void Send(Action callback) { if (bot.LastGetChatServerIdResponse == null) { callback(new Exception("No Server ID"), null); return; } try { #if OLD_CHAT HttpWebRequest webRequest = System.Net.WebRequest.Create(bot.LastGetChatServerIdResponse.s2c_clientHttp) as HttpWebRequest; webRequest.Method = "POST"; webRequest.BeginGetRequestStream(new System.AsyncCallback((System.IAsyncResult asynchronousResult) => { try { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; request.Timeout = 1000 * 300; request.ContentType = "multipart/form-data; boundary=" + BOUNDARY; request.KeepAlive = true; request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)"; Stream stream = request.EndGetRequestStream(asynchronousResult); StreamWriter postStream = new StreamWriter(stream); Dictionary textMap = new Dictionary(); { textMap.Add("account", bot.Account); textMap.Add("appid", bot.config.Appid.ToString()); ///************************/ //textMap.Add("serverId", DataMgr.Instance.AccountData.CurSrvInfo.ServerId.ToString()); textMap.Add("serverId", bot.LastGetChatServerIdResponse.s2c_serverId); string zoneid = bot.PlayerData.zoneId;//(string)DataMgr.Instance.UserData.GetAttribute(UserData.NotiFyStatus.ZONEID); string[] array = zoneid.Split('-'); int zoneidnum = int.Parse(array[0]) * 1000000 + int.Parse(array[1]); textMap.Add("realServerId", zoneidnum + ""); textMap.Add("myRoleId", bot.PlayerData.id/*DataMgr.Instance.UserData.RoleID.ToString()*/); textMap.Add("acceptRoleId", acceptRoleId); textMap.Add("channel", ((int)channel).ToString()); textMap.Add("chatContent", chatContent); textMap.Add("chatType", chatType); textMap.Add("serverData", serverData); } { var strBuf = new StringBuilder(); foreach (string key in textMap.Keys) { string inputName = key; string inputValue = ""; if (textMap[key] == null) { continue; } inputValue = (string)textMap[key]; strBuf.Append("\r\n" + "--" + BOUNDARY + "\r\n"); strBuf.Append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n"); strBuf.Append(inputValue); } postStream.Write(strBuf); } postStream.Write("\r\n--" + BOUNDARY + "--\r\n"); postStream.Flush(); postStream.Close(); postStream = null; WebResponse wrp = request.GetResponse(); StreamReader respRs = new StreamReader(wrp.GetResponseStream()); string responseData = ""; string readCallBackFileResponse = ""; while ((responseData = respRs.ReadLine()) != null) { readCallBackFileResponse += responseData + "\n"; } JsonObject obj = (JsonObject)SimpleJson.SimpleJson.DeserializeObject(readCallBackFileResponse); object status; if (obj.TryGetValue("status", out status) && (status as string) == "1") { Result = (true); } else { Result = (false); } bot.QueueTask(() => { callback(null, obj); }); } catch (Exception err) { bot.log.Error(err.Message, err); bot.QueueTask(() => { callback(err, null); }); } }), webRequest); #else var url = new Uri(bot.LastGetChatServerIdResponse.s2c_clientHttp); using (WebClient client = new WebClient(url)) { client.Request.Method = HttpRequest.METHOD_POST; client.Request.Referer = url.AbsoluteUri; { StringBuilder postStream = new StringBuilder(); Dictionary textMap = new Dictionary(); { textMap.Add("account", bot.Account); textMap.Add("appid", bot.config.Appid.ToString()); ///************************/ //textMap.Add("serverId", DataMgr.Instance.AccountData.CurSrvInfo.ServerId.ToString()); textMap.Add("serverId", bot.LastGetChatServerIdResponse.s2c_serverId); string zoneid = bot.PlayerData.zoneId;//(string)DataMgr.Instance.UserData.GetAttribute(UserData.NotiFyStatus.ZONEID); string[] array = zoneid.Split('-'); int zoneidnum = int.Parse(array[0]) * 1000000 + int.Parse(array[1]); textMap.Add("realServerId", zoneidnum + ""); textMap.Add("myRoleId", bot.PlayerData.id/*DataMgr.Instance.UserData.RoleID.ToString()*/); textMap.Add("acceptRoleId", acceptRoleId); textMap.Add("channel", ((int)channel).ToString()); textMap.Add("chatContent", chatContent); textMap.Add("chatType", chatType); textMap.Add("serverData", serverData); } { foreach (string key in textMap.Keys) { string inputName = key; string inputValue = ""; if (textMap[key] == null) { continue; } inputValue = (string)textMap[key]; postStream.Append("\r\n" + "--" + BOUNDARY + "\r\n"); postStream.Append("Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n"); postStream.Append(inputValue); } } postStream.Append("\r\n--" + BOUNDARY + "--\r\n"); var content = postStream.ToString(); client.Request.Content = CUtils.UTF8.GetBytes(content); client.Request.ContentType = "multipart/form-data; boundary=" + BOUNDARY; } client.ConnectAsync((www)=> { try { byte[] data = client.Response.ReadContentToEnd(); string ret = CUtils.UTF8.GetString(data); JsonObject obj = (JsonObject)SimpleJson.SimpleJson.DeserializeObject(ret); object status; if (obj.TryGetValue("status", out status) && (status as string) == "1") { Result = (true); } else { Result = (false); } bot.QueueTask(() => { callback(null, obj); }); } catch (Exception err) { bot.log.Error(err.Message, err); bot.QueueTask(() => { callback(err, null); }); } }); } #endif } catch (Exception err) { bot.log.Error(err.Message, err); callback(err, null); } } } } } }