using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Api.Framework; using Api.Framework.Cps; using Api.Framework.EntityTmp.KuaiShou; using Api.Framework.Enums; using Api.Framework.Events; using Api.Framework.Model; using Api.Framework.SDK; using Api.Framework.Timers; using Api.Framework.Tools; using Chat.Framework.WXSdk.Events; using Chat.Framework.WXSdk.Implement; using CsharpHttpHelper; using CsharpHttpHelper.Enum; using KSRebate.Properties; using Newtonsoft.Json; namespace KSRebate { public class MessageOperation { ReciveIMEvent e = null; Class1 plugin = null; object sender = null; public MessageOperation(object sender, ReciveIMEvent e, Class1 plugin) { this.e = e; this.plugin = plugin; this.sender = sender; } #region 订单绑定 public bool BindOrderId() { if (!Regex.IsMatch(e.Message.Trim(), @"^\d{16}$"))//2214500070274639 return false; var db = ApiClient.GetSession(); var member = e.GetMemberinfo(); var orderid = e.Message.Trim(); //通过宝贝的id 和 订单号 进行查询 查看是否存在 var orders = db.Find("select * from fl_order_kuaishou where oid = @oid", new { oid = orderid }); if (orders != null && orders.Count != 0) { var notices = new List(); var downkuaishouTimer = new DownKuaiShouTimer(); foreach (var order in orders) { if (order.db_userid != 0 && order.db_userid != member.id) { e.SendMessage(Class1.Config.OccupyOrderErrorTip.Replace("[订单号]", orderid)); return true; } if (order.db_userid != 0) { var point = HttpHelper.JsonToObject(order.db_point) as ItemPoint; member = e.GetMemberinfo(true); if (order.db_status == SystemOrderStatus.订单付款) e.SendMessage(new VariateReplace().CommonReplace(Class1.Config.OrderRepetBindTip, order, member, point)); else e.SendMessage(Class1._GetOrderStateMess(order.db_status, order, member, point)); } else { if (order.payTime < ApiClient.Setting.SystemConfig.allow_bind_create_order_time) { e.SendMessage($"订单:{orderid},已经过了有效绑定时间!"); return true; } if (order.db_status == SystemOrderStatus.订单结算) order.db_endtime = DateTime.Now.AddMinutes(-5);//重新结算的话,需要将订单的冻结时间重新赋值,让后台处理 //用户绑定订单 order.db_robotname = e.RobotName; order.db_robottype = e.ChatType; order.msg_groupid = e.Groupid; order.db_userid = member.id; db.SaveOrUpdate(order); member.bind_order++; member = db.UpdateMemberGroup(member); #region 首次付款时间 var record = db.FindStatisticsRecord(member.id); if (record == null) { record = new fl_statistics_record() { uid = member.id, ex2 = 0, ex4 = HttpExtend.GetTimeStamp(DateTime.Now) }; db.Saveable(record).ExecuteCommand(); } else { if (record.ex2 == 0 && record.ex4 == 0) { record.ex4 = HttpExtend.GetTimeStamp(DateTime.Now); db.Saveable(record).ExecuteCommand(); } } #endregion downkuaishouTimer.UpdateOrder(order, db, notices, isFrontData: true); } } #region 触发通知上级获得下级的提成奖励 if (!ApiClient.Setting.SystemConfig.message_warning_switch && notices.Count != 0) { var tasks = TimerTask.GetTimer() as Update_NoticeQueue; foreach (var item in notices) { //if (item.IsRewards) tasks.Add(item); //else //SDK_OrderNoticeEvent(this, item); } } #endregion e.Cancel = true; } else { CpsClient.UpdateOrder(CpsType.快手联盟, DateTime.Now.AddMinutes(-30), DateTime.Now, orderid); e.SendMessage(Class1.Config.NotFoundOrderErrorTip.Replace("[订单号]", orderid)); e.Cancel = true; return true; } return false; } #endregion private Dictionary debutTimes = new Dictionary(); public bool AnalyseFanLi() { var title = string.Empty; Compute compute = null; var msgid = Guid.NewGuid().ToString(); try { var db = ApiClient.GetSession(); var ksinfoTemps = db.FindKsInfoTempGroups(); var ksInfoTemp = ksinfoTemps.FirstOrDefault(f => f.name == e.RobotInfo.name && f.onoff == false); if (ksInfoTemp == null) return false; var memberTmp = e.GetMemberinfo(); var message = e.Message.Trim(); //推广位 var pid = string.Empty; fl_cps_member ks_cps = null; #region 判断使用的推广位 (群推广/私人推广位/默认推广位) var isDefaultPid = true; //判断消息是否为群消息并且判断群是否设置了群pid if (!string.IsNullOrWhiteSpace(e.Groupid))//群pid { var groupAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.快手联盟 && f.custom_type == PrivateAdzoneCustomType.群pid.ToString() && f.group_id == e.Groupid); if (groupAdzone != null && !string.IsNullOrWhiteSpace(groupAdzone.adzone_pid)) { pid = groupAdzone.adzone_pid; ks_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.快手联盟 && f.username == groupAdzone.adzone_pid_cps_name); isDefaultPid = false; } } if (isDefaultPid)//私人pid { var memberAdzone = db.FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.快手联盟 && f.custom_type == PrivateAdzoneCustomType.用户私人pid.ToString() && f.member_id == memberTmp.id); if (memberAdzone != null && !string.IsNullOrWhiteSpace(memberAdzone.adzone_pid))//私人推广位 { pid = memberAdzone.adzone_pid; ks_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.快手联盟 && f.username == memberAdzone.adzone_pid_cps_name); isDefaultPid = false; } } if (isDefaultPid)//默认推广位 { ks_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.快手联盟 && f.username == ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? ksInfoTemp.pid_chief_cps_name : ksInfoTemp.pid_deputy_cps_name));//通过判断用户的购物积分,来判断用户使用哪个推广位 pid = ((memberTmp.buy_point >= Class1.Config.Point && memberTmp.finish_order >= Class1.Config.OrderNum) ? ksInfoTemp.pid_chief : ksInfoTemp.pid_deputy); } if (ks_cps == null) throw new Exception("快手推广位设置异常,请检测后重试!"); #endregion if (string.IsNullOrWhiteSpace(pid)) throw new Exception("推广位数据异常,请重新设置推广位"); var api = CpsClient.CreateKuaiShouRequest(ks_cps); if (api == null) throw new Exception("@创建快手联盟API请求失败"); //商品id var item_id = KSHelper.GetItemId(message, out title); #region 标题搜索和商品id搜索 if (string.IsNullOrEmpty(item_id)) return false; if (!ApiClient.Setting.SystemConfig.message_warning_switch) e.SendMessage(Class1.Config.SearchingTip); //商品的详细信息 var itemInfo = api.GetItemInfo(item_id); if (itemInfo == null || itemInfo.promotionRate == 0) throw new Exception("商品无佣金"); //店铺ID var sellerId = itemInfo.mallId.ToString(); if (Class1.Config.SellerIDRestrictlist.Contains(sellerId)) { e.SendMessage(Class1.Config.SellerIDRestrictTip.Replace("[店铺ID]", sellerId)); return true; } //商品标题//< >&"© <,>,&,",©; itemInfo.goodsTitle = itemInfo.goodsTitle.Replace("‮", "").Replace("<", "<").Replace(">", ">").Replace("&", "&").Replace(""", "\"").Replace(" ©", "©");//这里有个看不见的字符,要将其替换掉 var price = Math.Round((itemInfo.goodsPrice / 100m), 2); if (itemInfo.zkGoodsPrice != 0) price = Math.Round((itemInfo.zkGoodsPrice / 100m), 2); //最高佣金率 var promotionAmount = Math.Round((itemInfo.promotionAmount / 100d), 2); //用券后 给用户的佣金 var commFee = db.FindItemPoint(memberTmp, promotionAmount * 0.9, 1, CpsType.快手联盟, out compute); var guid = Guid.NewGuid().ToString("N"); //返利信息入库 var itempointId = db.Insertable(new fl_itempoint1_hist() { guidkey = guid, cpstype = e.RobotInfo.type, robotname = e.RobotInfo.name, uid = memberTmp.id, gid = e.Groupid, text = JsonConvert.SerializeObject(compute) }).ExecuteReturnBigIdentity(); var turnInfo = api.TurnUrl(item_id, pid, guid); if (turnInfo == null) throw new Exception("商品转链异常"); var itemUrl = turnInfo.linkUrl; var kl = turnInfo.shareToken; #region 正常订单 var mess = string.Empty; if (e.ChatType == ChatType.微信 || e.ChatType == ChatType.企业微信 || (e.ChatType == ChatType.QQ && string.IsNullOrWhiteSpace(Class1.Config.QQSearchSuccessWithoutCouponTip))) mess = Class1.Config.SearchSuccessWithoutCouponTip; else mess = Class1.Config.QQSearchSuccessWithoutCouponTip; e.SendMessage(mess .Replace("[商品标题]", itemInfo.goodsTitle) .Replace("[商品原价]", string.Format("{0:F}", price)) .Replace("[商品主图]", $"[图片={itemInfo.goodsImageUrl}]") .Replace("[图片地址]", itemInfo.goodsImageUrl) .Replace("[月销量]", itemInfo.salesTip.ToString()) .Replace("[店铺名称]", itemInfo.mallName) .Replace("[返利积分]", string.Format("{0:F}", commFee.UserPoint)) .Replace("[购买地址]", itemUrl) .Replace("[购买口令]", kl) .Replace("[共节省]", string.Format("{0:F}", commFee.UserPoint)) .Replace("[商品图片]", mess.Contains("[商品图片]") ? "[图片=" + ApiClient.GetQRImage(itemInfo.goodsTitle, price.ToString(), "0", price.ToString(), itemInfo.goodsImageUrl, itemUrl, ApiClient.QrImageType.模板B, CpsType.快手联盟) + "]" : string.Empty) ); #endregion #region 记录用户信息,宝贝信息,平台信息,查询时间等 db.Insertable(new fl_query_hist() { crt_time = DateTime.Now, type = CpsType.快手联盟, itemid = item_id, groupid = e.Groupid, robot_name = e.RobotName, robot_type = e.ChatType, userid = memberTmp.id, title = itemInfo.goodsTitle, adzoneid = pid, mallid = sellerId, compute_configdic = compute == null ? string.Empty : JsonConvert.SerializeObject(compute) }).ExecuteCommand(); db.UpdateRecord(memberTmp.id); var shared = new Dictionary(); shared["msg_type"] = "查询宝贝"; shared["cps_type"] = CpsType.快手联盟; shared["msg_username"] = memberTmp.username; shared["price"] = string.Format("{0:F}", price); shared["title"] = itemInfo.goodsTitle; shared["coupon_price"] = "0"; shared["user_point"] = string.Format("{0:F}", commFee.UserPoint); shared["economize"] = string.Format("{0:F}", commFee.UserPoint); var sharedEvent = new SharedEvents(shared); EventClient.OnEvent(sender, sharedEvent); #endregion return true; #endregion } catch (Exception ex) { if (ex.Message.StartsWith("商品")) { var searchUrl = string.Empty; if (!string.IsNullOrWhiteSpace(title)) { try { var memberTmp = e.GetMemberinfo(); //推广位 var pid = string.Empty; #region 判断使用的推广位 (群推广/私人推广位/默认推广位) var isDefaultPid = true; #region 判断消息是否为群消息并且判断群是否设置了群pid if (!string.IsNullOrWhiteSpace(e.Groupid)) { var groupAdzone = ApiClient.GetSession().FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.快手联盟 && f.custom_type == PrivateAdzoneCustomType.群pid.ToString() && f.group_id == e.Groupid); if (groupAdzone != null && !string.IsNullOrWhiteSpace(groupAdzone.adzone_pid)) { pid = groupAdzone.adzone_pid; isDefaultPid = false; } } #endregion #region 判断消息是否为私人消息并且判断私人是否设置了私人pid if (isDefaultPid) { var memberAdzone = ApiClient.GetSession().FindAdzoneInfos().FirstOrDefault(f => f.alliance_id == (int)CpsType.快手联盟 && f.custom_type == PrivateAdzoneCustomType.用户私人pid.ToString() && f.member_id == memberTmp.id); if (memberAdzone != null && !string.IsNullOrWhiteSpace(memberAdzone.adzone_pid))//私人推广位 { pid = memberAdzone.adzone_pid; isDefaultPid = false; } } #endregion if (isDefaultPid)//默认推广位 { var tgw = Tools.GetTuiguangwei(e.RobotInfo.name, memberTmp); if (tgw == null || string.IsNullOrWhiteSpace(tgw.Pid)) throw new Exception("@快手推广位异常.请检测后重试!!"); pid = tgw.Pid; } #endregion var pids = pid.Split(new string[] { "_" }, StringSplitOptions.RemoveEmptyEntries); if (pids == null || pids.Length == 0) throw new Exception("推广位数据异常,请重新设置推广位"); var tb_cps = CpsClient.Members.FirstOrDefault(f => f.cpstype == CpsType.快手联盟 && f.username == pids[1]); if (tb_cps == null) throw new Exception("@快手推广位异常,请检测后重试!"); //关键词/标题 var keyword = string.Empty; //是否是标题 var IsTitle = false; var api = CpsClient.CreateAlimamaRequest(tb_cps); if (api == null) throw new Exception("@创建快手API请求失败"); searchUrl = api.ComposeTbCms(pid, keyword);//内置的搜索机制 } catch (Exception exception) { } } e.SendMessage(Class1.Config.SearchNoCommissionTip.Replace("[购买地址]", searchUrl)); //提示没有返利提示 var session = ApiClient.GetSession(); session.UpdateRecord(e.GetMemberinfo().id); var shared = new Dictionary(); shared["msg_type"] = "查询宝贝"; shared["cps_type"] = CpsType.快手联盟; shared["msg_username"] = e.GetMemberinfo().username; shared["price"] = "未知"; shared["title"] = "未知"; shared["coupon_price"] = "未知"; shared["user_point"] = "未知"; shared["economize"] = "未知"; var sharedEvent = new SharedEvents(shared); EventClient.OnEvent(sender, sharedEvent); return true; } if (ex.Message.StartsWith("@")) plugin.OnLog($"E :({e.RobotInfo.nick}【{e.RobotInfo.name}】){ex.Message.Replace("@", "")}"); else plugin.OnLog($"E:({e.RobotInfo.nick}【{e.RobotInfo.name}】){ex.Message} - {ex.StackTrace}"); plugin.OnLog(ApiClient.Setting.SystemConfig.msg_error); } return false; } } }