using System; using System.Collections.Generic; using Server.DB.Redis; using GameData; using MrWu.Debug; using StackExchange.Redis; using Server.Data.ClubDef; using GameDAL.FriendRoom; using System.Linq; using System.Threading.Tasks; using MrWu.Basic; namespace Server { /// /// 玩法管理 /// public class WayManager { /* 玩法只需要存储桌子的唯一码,具体的数据到Room 类里面拿 * * 1.加入玩法房间 * 2.创建玩法房间 * 3.退出玩法房间 * * 4.玩法被删除。-> 主动解散房间 * * * * * */ /// /// 数据库Idx /// public const int DbIdx = 6; /// /// 实例 /// public static WayManager instance { get; private set; } private WayManager() { } static WayManager() { instance = new WayManager(); } /// /// 数据库代理 /// public IDatabaseProxy databaseProxy { get { return redisManager.Getdb(DbIdx); } } /// /// redis数据事务操作 /// public IDatabase db { get { return redisManager.GetDataBase(DbStyle.main, DbIdx); } } /// /// 基本Key /// public const string BaseKey = "ClubWay:"; /// /// 获取桌子信息的Key值 /// /// 竞技比赛id /// 玩法id public string GetDeskInfoKey(int clubid, string wayid) { return $"{BaseKey}{clubid}:{wayid}"; } /// ///保存玩法的桌子 /// /// 竞技比赛id /// 玩法id /// 唯一码 public void SaveWayDesk(int clubid, string wayid, string weiyima) { string key = GetDeskInfoKey(clubid, wayid); //暂时 Hash 的 Value 不存放数据, 没啥可以存的。留给以后扩展 databaseProxy.HashSet(key, weiyima, 0); // WayDeskChangeSend(clubid, wayid, weiyima, 0); } /// /// 删除玩法的桌子信息 /// /// /// /// public void DelDeskInfo(int clubid, string wayid, string weiyima) { string key = GetDeskInfoKey(clubid, wayid); //WayDeskChangeSend(clubid, wayid, weiyima, 1); databaseProxy.HashDelete(key, weiyima); } /// /// 删除玩法 /// /// 竞技比赛id /// 玩法id public void DelWay(int clubid, string wayid) { string key = GetDeskInfoKey(clubid, wayid); //写这两句是要干嘛 玩法是竞技比赛发起的,发给竞技比赛多余 //var weiyimaList = GetDesksWeiYiMa(clubid, wayid).Select(p => p.Name).ToList(); //weiyimaList.ForEach(weiyima => WayDeskChangeSend(clubid, wayid, weiyima, 1)); databaseProxy.KeyDelete(key); } public Task LoadDeskInfoAsync(string weiyima) { return Task.Run(() => LoadDeskInfo(weiyima)); } /// /// 加载桌子信息 /// /// 唯一码 /// public DeskInfo LoadDeskInfo(string weiyima) { //去Room 类里面找到加载DeskInfo 方法补充起来 DeskInfo deskinfo = null; if(!Room.LoadRoom(weiyima, out deskinfo)) { Debug.Info("未加载成功!"); return null; } if(deskinfo == null) { Debug.Info("加载成功, 却没有桌子信息???"); } return deskinfo; } // /// // /// 加载某个玩法的所有桌子信息 // /// // /// // public List LoadDeskInfo(int clubid, string wayid) { // string key = GetDeskInfoKey(clubid, wayid); // // return LoadDeskInfoInternal(key); // } public Task> LoadDeskInfoAsync(int clubId) { return Task.Run(() => LoadDeskInfo(clubId)); } /// /// 获取竞技比赛的所有桌子 /// /// /// public List LoadDeskInfo(int clubid) { string pattern = GetDeskInfoKey(clubid, "*"); //获取此club所有玩法的key var clubKeys = redisManager.Keys(pattern, DbIdx, 1000,DbStyle.main); //将当前club的所有玩法及每玩法的所有桌; int len = clubKeys.Count; List infos = new List(); for (int i = 0; i < len; i++) { infos.AddRange(LoadDeskInfoInternal(clubKeys[i])); } return infos; } List LoadDeskInfoInternal(RedisKey key) { List desks = new List(); //获取此key下所有唯一码 var weiyimaArray = databaseProxy.HashGetAll(key); int len = weiyimaArray.Length; DeskInfo info; for (int i = 0; i < len; i++) { info = LoadDeskInfo(weiyimaArray[i].Name); if (info != null) desks.Add(info); } return desks; // return weiyimaArray.Select(weiyima => LoadDeskInfo(weiyima)).Where(deskInfo => deskInfo != null).ToList(); } /// /// 获取这个玩法的所有的桌子的唯一码 /// /// /// /// 唯一码 玩家人数 public HashEntry[] GetDesksWeiYiMa(int clubid, string wayid) { return databaseProxy.HashGetAll(GetDeskInfoKey(clubid, wayid)); } /// /// 竞技比赛玩家变化 /// /// 竞技比赛id /// 玩法id /// 桌子的唯一码 /// 是否是增量 true 增 false 减 public ClubWayPlayer ClubWayPlayerChange(int clubid, string wayid, string weiyima, bool isInc) { //组建ClubWayPlayer string key = GetDeskInfoKey(clubid, wayid); ClubWayPlayer cwp = new ClubWayPlayer(); cwp.clubid = clubid; cwp.wayid = wayid; cwp.weiyima = weiyima; if (isInc) cwp.playerCnt = (int)databaseProxy.HashIncrement(key, weiyima); else cwp.playerCnt = (int)databaseProxy.HashDecrement(key, weiyima); //cwp.playerCnt = (int)databaseProxy.HashIncrement(GetDeskInfoKey(clubid, wayid), weiyima, isInc ? 1 : -1); return cwp; /* ClubWayPlayer cwp = new ClubWayPlayer(); cwp.clubid = clubid; cwp.wayid = wayid; string key = GetKey(clubid, wayid); var datas = redisManager.db.SortedSetRangeByRankWithScores(key, 0, -1, Order.Descending); if (datas == null) { cwp.deskCnt = 0; cwp.playerCnt = 0; } else { int len = datas.Length; for (int i = 0; i < len; i++) { if (datas[i].Score < minCnt) { cwp.playerCnt = (int)datas[i].Score; break; } } cwp.deskCnt = len; } return cwp; */ } /// /// 玩法的桌子变化 数据发送 /// /// 竞技比赛id /// 玩法id /// 桌子的唯一码 /// 类型 0新增 1删除 2更新 public void WayDeskChangeSend(int clubid, string wayid, string weiyima, int style) { //组建 WayDeskChange 包裹发送给竞技比赛 var wdc = new Data.WayDeskChange { clubid = clubid, wayid = wayid, deskweiyima = weiyima, style = style }; PackHead head = PackHead.Create(Pack.ServerPackAgreement.WayDeskChange); MQ.GlobalMQ.instance.DeliveryEveryOne((int)Data.Module.ModuleType.ClubModule, MQ.GlobalMQ.CreateMessage(head, wdc), true); head.Dispose(); } } }