protected void SetContinueAlert(string tdid, Func <bool> isTrigger) { if (isTrigger == null) { return; } if (isTrigger.Invoke()) { if (!ContinueData.ContainsTDID(tdid)) { Add(tdid); } } else { Remove(tdid); } }
static IObservable <AppBinary?> UpdateAppData(ContinueData <PushVersionCommand> m) { var(commit, fileName) = ((string, ITempFile))m.Result.Outcome !; return(Observable.Using(() => fileName, file => ( from info in Observable.Return((Commit: commit, File: file, Data: m)) let oldApp = info.Data.AppData ?? AppData.Empty let newVersion = oldApp.Last + 1 let newId = $"{oldApp.Id}-{newVersion}.zip" let newBinary = new AppFileInfo(newId, oldApp.Last + 1, DateTime.UtcNow, false, info.Commit) let newData = oldApp with { Last = newVersion, LastUpdate = DateTime.UtcNow, Versions = info.Data.AppData !.Versions.Add(newBinary) } select(info.Data.State, NewData: newData, NewBinary: newBinary, info.File, ToDelete: newData.Versions.OrderByDescending(i => i.CreationTime).Skip(5) .Where(i => !i.Deleted).ToArray()) ) .Select(i => { using var stream = i.State.Files.GetFile(i.NewBinary.Id).Create(); using var fileStream = i.File.Stream; fileStream.Seek(0, SeekOrigin.Begin); fileStream.CopyTo(stream); var newData = i.ToDelete .Aggregate(i.NewData, (current, appFileInfo) => current !with { Versions = current.Versions .Replace(appFileInfo, appFileInfo with { Deleted = true }) }); i.State.Apps.Update(newData !); i.State.ToDelete.Add(i.ToDelete.Select(e => new ToDeleteRevision(e.Id))); return (Data: newData, i.NewBinary, i.State); })
public void Remove(TData alert) { if (alert == null) { return; } alert.OnBeRemoved(); Data.Remove(alert); if (alert.Type == AlertType.Interaction) { InteractionData.Remove(alert); Callback_OnInteractionChange?.Invoke(alert); } else if (alert.Type == AlertType.Disposable) { DisposableData.Remove(alert); Callback_DisposableChange?.Invoke(alert); } else if (alert.Type == AlertType.Continue) { ContinueData.Remove(alert); Callback_ContinueChange?.Invoke(alert); } //移除Article foreach (var item in alert.SelfArticle) { ArticleMgr.RemoveArticle(item); } foreach (var item in alert.TargetArticle) { ArticleMgr.RemoveArticle(item); } if (BaseGlobal.IsUnReadData) { Callback_OnRemoved?.Invoke(alert); } }
private TData Add(string tdid, BaseUnit cast = null, Callback <TData> action = null, bool isAutoTrigger = false) { if (!TDLuaMgr.Contains(tdid)) { if (CommonAlert == tdid) { CLog.Error("没有:{0},请手动添加CommonAlert", tdid); } else { CLog.Error("没有:{0},请手动添加Alert", tdid); } return(null); } TData sourceAlert = TDLuaMgr.Get <TData>(tdid); sourceAlert.Cast = cast ? cast : LocalPlayer; sourceAlert.AlertMgr = this; //判断通知是否可以被合并 var finalAlert = CanMerge(sourceAlert); if (finalAlert != null) { finalAlert.OnMerge(); Callback_OnMerge?.Invoke(finalAlert); } else { finalAlert = sourceAlert.Copy <TData>(); finalAlert.ID = IDUtil.Gen(); finalAlert.OnBeAdded(SelfBaseUnit); Data.Add(finalAlert); if (finalAlert.Type == AlertType.Interaction) { //推送最近一次的谈判信息 if (ArticleMgr.IsStarNegotiation) { ArticleMgr.PushNagotiationToAlert(finalAlert); } InteractionData.Add(finalAlert); Callback_OnInteractionChange?.Invoke(finalAlert); } else if (finalAlert.Type == AlertType.Disposable) { DisposableData.Add(finalAlert); Callback_DisposableChange?.Invoke(finalAlert); } else if (finalAlert.Type == AlertType.Continue) { ContinueData.Add(finalAlert); Callback_ContinueChange?.Invoke(finalAlert); } action?.Invoke(finalAlert); if (BaseGlobal.IsUnReadData) { Callback_OnAdded?.Invoke(finalAlert); } } if (finalAlert.IsAutoTrigger || isAutoTrigger) { finalAlert.DoLeftClickTrigger(); } return(finalAlert); }