private static bool IsConflicting(IModelRepositoryMod origin, IModelRepositoryMod otherMod, IModelStorageMod selected) { if (origin.State == LoadingState.Loading || otherMod.State == LoadingState.Loading || selected.GetState() == StorageModStateEnum.Loading) { return(false); } if (otherMod.GetVersionHash().IsMatch(origin.GetVersionHash())) { return(false); // that's fine, won't break anything } if (!otherMod.GetMatchHash().IsMatch(selected.GetMatchHash())) { return(false); // unrelated mod, we don't care } var actionType = GetModAction(origin, selected); if (actionType == ModActionEnum.Use) { return(false); // not our problem. only show conflict when we're trying to change something } return(true); }
// TODO: create more tests. especially for loading/error handling // TODO: split up. need to figure out how tho.. internal static ModActionEnum GetModAction(IModelRepositoryMod repoMod, IModelStorageMod storageMod) { if (repoMod.State == LoadingState.Loading || storageMod.GetState() == StorageModStateEnum.Loading) { return(ModActionEnum.Loading); } if (repoMod.State == LoadingState.Error || storageMod.GetState() == StorageModStateEnum.Error) { return(ModActionEnum.Unusable); } bool CheckMatch() => repoMod.GetMatchHash().IsMatch(storageMod.GetMatchHash()); bool CheckVersion() => repoMod.GetVersionHash().IsMatch(storageMod.GetVersionHash()); switch (storageMod.GetState()) { case StorageModStateEnum.CreatedWithUpdateTarget: { if (CheckVersion()) { return(ModActionEnum.ContinueUpdate); } if (CheckMatch()) { return(ModActionEnum.AbortAndUpdate); } return(ModActionEnum.Unusable); } case StorageModStateEnum.Created: { if (!CheckMatch()) { return(ModActionEnum.Unusable); } if (CheckVersion()) { return(ModActionEnum.Use); } return(storageMod.CanWrite ? ModActionEnum.Update : ModActionEnum.UnusableSteam); } case StorageModStateEnum.Updating: { if (CheckVersion()) { return(ModActionEnum.Await); } if (CheckMatch()) { return(ModActionEnum.AbortActiveAndUpdate); } return(ModActionEnum.Unusable); } default: throw new ArgumentOutOfRangeException(); } }