diff --git a/Refresh.Analyzers/ActivityGenerator.cs b/Refresh.Analyzers/ActivityGenerator.cs deleted file mode 100644 index 00a78f7a..00000000 --- a/Refresh.Analyzers/ActivityGenerator.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System.Text; -using JetBrains.Annotations; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Text; -using Refresh.Analyzers.SyntaxReceivers; - -namespace Refresh.Analyzers; - -[Generator] -public class ActivityGenerator : ISourceGenerator -{ - [LanguageInjection("csharp")] - private const string Header = - """ - // - using Refresh.GameServer.Types.Activity; - using Refresh.GameServer.Types.UserData; - using Refresh.GameServer.Types.UserData.Leaderboard; - using Refresh.GameServer.Types.Relations; - using Refresh.GameServer.Types.Levels; - """; - - public void Initialize(GeneratorInitializationContext context) - { - // no initialization code - } - - /// - /// Returns the type indicated by the input. - /// Example: Level_Upload resolves to GameLevel - /// - private static string GetTypeFromName(string input) - { - string typeName = input.Substring(0, input.IndexOf('_')); - - if (typeName != "RateLevelRelation") return "Game" + typeName; - return typeName; - } - - private static (string, string) GetIdFieldFromName(string name) - { - string idField; - string idFieldValue; - - name = name.Replace("Game", ""); - - if (name != "User" && name != "Score" && name != "SubmittedScore" && name != "RateLevelRelation") - { - idField = "StoredSequentialId"; - idFieldValue = idField + ".Value"; - } - else - { - idField = "StoredObjectId"; - idFieldValue = idField; - } - - return (idField, idFieldValue); - } - - private static void GenerateCreateEvents(GeneratorExecutionContext context, IEnumerable names) - { - string code = string.Empty; - foreach (string eventName in names) - { - string type = GetTypeFromName(eventName); - string typeParam = type.ToLower(); - string typeId = type.Replace("Game", "").Replace("Submitted", ""); - - (string idField, string _) = GetIdFieldFromName(type); - - string method = $@" - /// - /// Creates a new {eventName} event from a , and adds it to the event list. - /// - public Event Create{eventName.Replace("_", string.Empty)}Event(GameUser userFrom, {type} {typeParam}) - {{ - Event @event = new(); - @event.EventType = EventType.{eventName}; - @event.StoredDataType = EventDataType.{typeId}; - @event.Timestamp = this._time.TimestampMilliseconds; - @event.User = userFrom; - - @event.{idField} = {typeParam}.{typeId}Id; - - this._realm.Write(() => this._realm.Add(@event)); - return @event; - }} -"; - - code += method; - } - - - string sourceCode = $@"{Header} -namespace Refresh.GameServer.Database; - -public partial class GameDatabaseContext -{{ -{code} -}}"; - - context.AddSource("RealmDatabaseContext.Activity.CreateEvents.g.cs", SourceText.From(sourceCode, Encoding.UTF8)); - } - - private static void GenerateDataGetters(GeneratorExecutionContext context, IEnumerable names) - { - string code = string.Empty; - - foreach (string name in names) - { - string type = "Game" + name; - if (name == "RateLevelRelation") type = name; - - (string idField, string idFieldValue) = GetIdFieldFromName(name); - - string idAccess = name + "Id"; - if (name == "GameSubmittedScore" || type == "GameScore") - { - idAccess = "ScoreId"; - type = "GameSubmittedScore"; - } - - string method = $@" - public {type}? Get{name}FromEvent(Event @event) - {{ - if (@event.StoredDataType != EventDataType.{name}) - throw new InvalidOperationException(""Event does not store the correct data type (expected {name})""); - - if (@event.{idField} == null) - throw new InvalidOperationException(""Event was not created correctly, expected {idField} to not be null""); - - return this._realm.All<{type}>() - .FirstOrDefault(l => l.{idAccess} == @event.{idFieldValue}); - }} -"; - - code += method; - } - - string sourceCode = $@"{Header} -namespace Refresh.GameServer.Database; - -#nullable enable - -public partial class GameDatabaseContext -{{ -{code} -}}"; - - context.AddSource("GameDatabaseContext.Activity.DataGetters.g.cs", SourceText.From(sourceCode, Encoding.UTF8)); - } - - public void Execute(GeneratorExecutionContext context) - { - EnumNameReceiver syntaxReceiver = new(); - - foreach (SyntaxTree tree in context.Compilation.SyntaxTrees) - syntaxReceiver.OnVisitSyntaxNode(tree.GetRoot()); - - - foreach ((string className, List names) in syntaxReceiver.Enums) - switch (className) - { - case "EventType": - GenerateCreateEvents(context, names); - break; - case "EventDataType": - GenerateDataGetters(context, names); - break; - } - } -} \ No newline at end of file diff --git a/Refresh.Analyzers/Refresh.Analyzers.csproj b/Refresh.Analyzers/Refresh.Analyzers.csproj deleted file mode 100644 index eb2131fb..00000000 --- a/Refresh.Analyzers/Refresh.Analyzers.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - netstandard2.1 - enable - enable - 11 - true - - - - - - - - diff --git a/Refresh.Analyzers/SyntaxReceivers/EnumNameReceiver.cs b/Refresh.Analyzers/SyntaxReceivers/EnumNameReceiver.cs deleted file mode 100644 index 23916808..00000000 --- a/Refresh.Analyzers/SyntaxReceivers/EnumNameReceiver.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace Refresh.Analyzers.SyntaxReceivers; - -public class EnumNameReceiver : ISyntaxReceiver -{ - public Dictionary> Enums { get; } = new(); - - public void OnVisitSyntaxNode(SyntaxNode syntaxNode) - { - foreach (EnumDeclarationSyntax declaration in syntaxNode.DescendantNodes().OfType()) - { - string className = declaration.Identifier.Value!.ToString(); - List enumMembers = declaration.Members.Select(m => m.Identifier.ValueText).ToList(); - - this.Enums.TryAdd(className, enumMembers); - } - } -} \ No newline at end of file diff --git a/Refresh.GameServer/Database/GameDatabaseContext.Activity.cs b/Refresh.GameServer/Database/Activity/GameDatabaseContext.Activity.cs similarity index 97% rename from Refresh.GameServer/Database/GameDatabaseContext.Activity.cs rename to Refresh.GameServer/Database/Activity/GameDatabaseContext.Activity.cs index c407295e..7029c507 100644 --- a/Refresh.GameServer/Database/GameDatabaseContext.Activity.cs +++ b/Refresh.GameServer/Database/Activity/GameDatabaseContext.Activity.cs @@ -28,8 +28,8 @@ public DatabaseList GetUserRecentActivity(ActivityQueryParameters paramet userFriends.Contains(e.User.UserId) || userFriends.Contains(e.StoredObjectId) || this.GetLevelById(e.StoredSequentialId ?? int.MaxValue)?.Publisher?.UserId == parameters.User.UserId || - e.EventType == EventType.Level_TeamPick || - e.EventType == EventType.User_FirstLogin + e.EventType == EventType.LevelTeamPick || + e.EventType == EventType.UserFirstLogin ); } diff --git a/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityRead.cs b/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityRead.cs new file mode 100644 index 00000000..a961a3f3 --- /dev/null +++ b/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityRead.cs @@ -0,0 +1,52 @@ +using System.Diagnostics; +using Refresh.GameServer.Types.Activity; +using Refresh.GameServer.Types.Levels; +using Refresh.GameServer.Types.Relations; +using Refresh.GameServer.Types.UserData; +using Refresh.GameServer.Types.UserData.Leaderboard; + +namespace Refresh.GameServer.Database; + +public partial class GameDatabaseContext // ActivityRead +{ + public GameUser? GetUserFromEvent(Event e) + { + if (e.StoredDataType != EventDataType.User) + throw new InvalidOperationException($"Event does not store the correct data type (expected {nameof(EventDataType.User)})"); + + Debug.Assert(e.StoredObjectId != null); + + return this.GetUserByObjectId(e.StoredObjectId); + } + + public GameLevel? GetLevelFromEvent(Event e) + { + if (e.StoredDataType != EventDataType.Level) + throw new InvalidOperationException($"Event does not store the correct data type (expected {nameof(EventDataType.Level)})"); + + Debug.Assert(e.StoredSequentialId != null); + + return this.GetLevelById(e.StoredSequentialId.Value); + } + + public GameSubmittedScore? GetScoreFromEvent(Event e) + { + if (e.StoredDataType != EventDataType.Score) + throw new InvalidOperationException($"Event does not store the correct data type (expected {nameof(EventDataType.Score)})"); + + Debug.Assert(e.StoredObjectId != null); + + return this.GetScoreByObjectId(e.StoredObjectId); + } + + public RateLevelRelation? GetRateLevelRelationFromEvent(Event e) + { + if (e.StoredDataType != EventDataType.RateLevelRelation) + throw new InvalidOperationException($"Event does not store the correct data type (expected {nameof(EventDataType.RateLevelRelation)})"); + + Debug.Assert(e.StoredObjectId != null); + + return this._realm.All() + .FirstOrDefault(l => l.RateLevelRelationId == e.StoredObjectId); + } +} \ No newline at end of file diff --git a/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityWrite.cs b/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityWrite.cs new file mode 100644 index 00000000..6129eb2f --- /dev/null +++ b/Refresh.GameServer/Database/Activity/GameDatabaseContext.ActivityWrite.cs @@ -0,0 +1,226 @@ +using Refresh.GameServer.Types.Activity; +using Refresh.GameServer.Types.Levels; +using Refresh.GameServer.Types.Relations; +using Refresh.GameServer.Types.UserData; +using Refresh.GameServer.Types.UserData.Leaderboard; + +namespace Refresh.GameServer.Database; + +public partial class GameDatabaseContext // ActivityWrite +{ + /// + /// Creates a new LevelUpload event from a , and adds it to the event list. + /// + public Event CreateLevelUploadEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelUpload, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelFavourite event from a , and adds it to the event list. + /// + public Event CreateLevelFavouriteEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelFavourite, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelUnfavourite event from a , and adds it to the event list. + /// + public Event CreateLevelUnfavouriteEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelUnfavourite, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new UserFavourite event from a , and adds it to the event list. + /// + public Event CreateUserFavouriteEvent(GameUser userFrom, GameUser user) + { + Event e = new() + { + EventType = EventType.UserFavourite, + StoredDataType = EventDataType.User, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredObjectId = user.UserId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new UserUnfavourite event from a , and adds it to the event list. + /// + public Event CreateUserUnfavouriteEvent(GameUser userFrom, GameUser user) + { + Event e = new() + { + EventType = EventType.UserUnfavourite, + StoredDataType = EventDataType.User, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredObjectId = user.UserId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelPlay event from a , and adds it to the event list. + /// + public Event CreateLevelPlayEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelPlay, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelTag event from a , and adds it to the event list. + /// + public Event CreateLevelTagEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelTag, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelTeamPick event from a , and adds it to the event list. + /// + public Event CreateLevelTeamPickEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelTeamPick, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelRate event from a , and adds it to the event list. + /// + public Event CreateRateLevelEvent(GameUser userFrom, RateLevelRelation relation) + { + Event e = new() + { + EventType = EventType.LevelRate, + StoredDataType = EventDataType.RateLevelRelation, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredObjectId = relation.RateLevelRelationId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelReview event from a , and adds it to the event list. + /// + public Event CreateLevelReviewEvent(GameUser userFrom, GameLevel level) + { + Event e = new() + { + EventType = EventType.LevelReview, + StoredDataType = EventDataType.Level, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredSequentialId = level.LevelId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new LevelScore event from a , and adds it to the event list. + /// + public Event CreateLevelScoreEvent(GameUser userFrom, GameSubmittedScore score) + { + Event e = new() + { + EventType = EventType.LevelScore, + StoredDataType = EventDataType.Score, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredObjectId = score.ScoreId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } + + /// + /// Creates a new UserFirstLogin event from a , and adds it to the event list. + /// + public Event CreateUserFirstLoginEvent(GameUser userFrom, GameUser user) + { + Event e = new() + { + EventType = EventType.UserFirstLogin, + StoredDataType = EventDataType.User, + Timestamp = this._time.TimestampMilliseconds, + User = userFrom, + StoredObjectId = user.UserId, + }; + + this._realm.Write(() => this._realm.Add(e)); + return e; + } +} \ No newline at end of file diff --git a/Refresh.GameServer/Database/GameDatabaseContext.Leaderboard.cs b/Refresh.GameServer/Database/GameDatabaseContext.Leaderboard.cs index 702eb125..37a947fa 100644 --- a/Refresh.GameServer/Database/GameDatabaseContext.Leaderboard.cs +++ b/Refresh.GameServer/Database/GameDatabaseContext.Leaderboard.cs @@ -31,7 +31,7 @@ public GameSubmittedScore SubmitScore(SerializedScore score, GameUser user, Game this._realm.Add(newScore); }); - this.CreateSubmittedScoreCreateEvent(user, newScore); + this.CreateLevelScoreEvent(user, newScore); #region Notifications diff --git a/Refresh.GameServer/Refresh.GameServer.csproj b/Refresh.GameServer/Refresh.GameServer.csproj index 96b1f3b3..eb0d5d3a 100644 --- a/Refresh.GameServer/Refresh.GameServer.csproj +++ b/Refresh.GameServer/Refresh.GameServer.csproj @@ -78,10 +78,6 @@ - - false - Analyzer - diff --git a/Refresh.GameServer/Refresh.GameServer.csproj.DotSettings b/Refresh.GameServer/Refresh.GameServer.csproj.DotSettings new file mode 100644 index 00000000..84fed0cc --- /dev/null +++ b/Refresh.GameServer/Refresh.GameServer.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Refresh.GameServer/Types/Activity/ActivityPage.cs b/Refresh.GameServer/Types/Activity/ActivityPage.cs index ac2b85fd..c44cae4d 100644 --- a/Refresh.GameServer/Types/Activity/ActivityPage.cs +++ b/Refresh.GameServer/Types/Activity/ActivityPage.cs @@ -232,8 +232,8 @@ private void GenerateLevelGroups(ActivityGroups groups) // You will waste 30 seconds of your time if you don't. levelEvent = @event.EventType switch { - EventType.Level_Upload => SerializedLevelUploadEvent.FromSerializedLevelEvent(levelEvent), - EventType.Level_Play => SerializedLevelPlayEvent.FromSerializedLevelEvent(levelEvent), + EventType.LevelUpload => SerializedLevelUploadEvent.FromSerializedLevelEvent(levelEvent), + EventType.LevelPlay => SerializedLevelPlayEvent.FromSerializedLevelEvent(levelEvent), _ => levelEvent, }; @@ -259,7 +259,7 @@ private void GenerateLevelGroups(ActivityGroups groups) private void GenerateScoreGroups(ActivityGroups groups, IReadOnlyCollection scores) { - foreach (Event @event in this.Events.Where(e => e.EventType == EventType.SubmittedScore_Create)) + foreach (Event @event in this.Events.Where(e => e.EventType == EventType.LevelScore)) { GameSubmittedScore score = scores.First(u => u.ScoreId == @event.StoredObjectId); diff --git a/Refresh.GameServer/Types/Activity/EventType.cs b/Refresh.GameServer/Types/Activity/EventType.cs index f755b3a1..9dab9594 100644 --- a/Refresh.GameServer/Types/Activity/EventType.cs +++ b/Refresh.GameServer/Types/Activity/EventType.cs @@ -1,57 +1,55 @@ -using System.Diagnostics.CodeAnalysis; using System.Xml.Serialization; using Newtonsoft.Json.Converters; namespace Refresh.GameServer.Types.Activity; [JsonConverter(typeof(StringEnumConverter))] -[SuppressMessage("ReSharper", "InconsistentNaming")] -public enum EventType +public enum EventType : byte { [XmlEnum("publish_level")] - Level_Upload = 0, + LevelUpload = 0, [XmlEnum("heart_level")] - Level_Favourite = 1, + LevelFavourite = 1, [XmlEnum("unheart_level")] - Level_Unfavourite = 2, + LevelUnfavourite = 2, [XmlEnum("heart_user")] - User_Favourite = 3, + UserFavourite = 3, [XmlEnum("unheart_user")] - User_Unfavourite = 4, + UserUnfavourite = 4, [XmlEnum("play_level")] - Level_Play = 5, - // [XmlEnum("rate_level")] - // Level_Rate = 6, + LevelPlay = 5, + [XmlEnum("rate_level")] + LevelStarRate = 6, // as opposed to dpad rating. unused since we convert stars to dpad [XmlEnum("tag_level")] - Level_Tag = 7, - // [XmlEnum("comment_on_level")] - // PostLevelComment = 8, - // [XmlEnum("delete_level_comment")] - // DeleteLevelComment = 9, - // [XmlEnum("upload_photo")] - // Photo_Upload = 10, - // [XmlEnum("unpublish_level")] - // Level_Unpublish = 11, - // [XmlEnum("news_post")] - // News_Post = 12, + LevelTag = 7, + [XmlEnum("comment_on_level")] + PostLevelComment = 8, + [XmlEnum("delete_level_comment")] + DeleteLevelComment = 9, + [XmlEnum("upload_photo")] + PhotoUpload = 10, + [XmlEnum("unpublish_level")] + LevelUnpublish = 11, + [XmlEnum("news_post")] + NewsPost = 12, [XmlEnum("mm_pick_level")] - Level_TeamPick = 13, + LevelTeamPick = 13, [XmlEnum("dpad_rate_level")] - RateLevelRelation_Create = 14, + LevelRate = 14, [XmlEnum("review_level")] - Level_Review = 15, - // [XmlEnum("comment_on_user")] - // PostUserComment = 16, - // [XmlEnum("create_playlist")] - // Playlist_Create = 17, - // [XmlEnum("heart_playlist")] - // Playlist_Favourite = 18, - // [XmlEnum("add_level_to_playlist")] - // Playlist_AddLevel = 19, + LevelReview = 15, + [XmlEnum("comment_on_user")] + PostUserComment = 16, + [XmlEnum("create_playlist")] + PlaylistCreate = 17, + [XmlEnum("heart_playlist")] + PlaylistFavourite = 18, + [XmlEnum("add_level_to_playlist")] + PlaylistAddLevel = 19, [XmlEnum("score")] - SubmittedScore_Create = 20, // FIXME: this name is shit + LevelScore = 20, // Custom events [XmlEnum("firstlogin")] - User_FirstLogin = 127, + UserFirstLogin = 127, } \ No newline at end of file diff --git a/Refresh.GameServer/Workers/DiscordIntegrationWorker.cs b/Refresh.GameServer/Workers/DiscordIntegrationWorker.cs index b788785c..ca1eab52 100644 --- a/Refresh.GameServer/Workers/DiscordIntegrationWorker.cs +++ b/Refresh.GameServer/Workers/DiscordIntegrationWorker.cs @@ -60,18 +60,18 @@ private string GetAssetUrl(string hash) string? description = @event.EventType switch { - EventType.Level_Upload => $"uploaded the level {levelLink}", - EventType.Level_Favourite => $"gave {levelLink} a heart", - EventType.Level_Unfavourite => null, - EventType.User_Favourite => $"hearted {userLink}", - EventType.User_Unfavourite => null, - EventType.Level_Play => null, - EventType.Level_Tag => null, - EventType.Level_TeamPick => $"team picked {levelLink}", - EventType.RateLevelRelation_Create => null, - EventType.Level_Review => null, - EventType.SubmittedScore_Create => $"got {score!.Score:N0} points on {levelLink}", - EventType.User_FirstLogin => "logged in for the first time", + EventType.LevelUpload => $"uploaded the level {levelLink}", + EventType.LevelFavourite => $"gave {levelLink} a heart", + EventType.LevelUnfavourite => null, + EventType.UserFavourite => $"hearted {userLink}", + EventType.UserUnfavourite => null, + EventType.LevelPlay => null, + EventType.LevelTag => null, + EventType.LevelTeamPick => $"team picked {levelLink}", + EventType.LevelRate => null, + EventType.LevelReview => null, + EventType.LevelScore => $"got {score!.Score:N0} points on {levelLink}", + EventType.UserFirstLogin => "logged in for the first time", _ => null, }; diff --git a/Refresh.sln b/Refresh.sln index a834dfa7..9fec4eec 100644 --- a/Refresh.sln +++ b/Refresh.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Refresh.GameServer", "Refresh.GameServer\Refresh.GameServer.csproj", "{622EB919-5FD2-45FE-B006-4EE5C7849FDF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Refresh.Analyzers", "Refresh.Analyzers\Refresh.Analyzers.csproj", "{4717B220-62C1-4CF9-9734-D9975C462159}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RefreshTests.GameServer", "RefreshTests.GameServer\RefreshTests.GameServer.csproj", "{8DC15128-D9C9-498B-AD3B-537C50966C91}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Refresh.Common", "Refresh.Common\Refresh.Common.csproj", "{A3D76B31-8732-4134-907B-F36773DF70D3}" @@ -27,12 +25,6 @@ Global {622EB919-5FD2-45FE-B006-4EE5C7849FDF}.DebugLocalBunkum|Any CPU.Build.0 = DebugLocalBunkum|Any CPU {622EB919-5FD2-45FE-B006-4EE5C7849FDF}.Debug|Any CPU.Build.0 = Debug|Any CPU {622EB919-5FD2-45FE-B006-4EE5C7849FDF}.Release|Any CPU.Build.0 = Release|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.Release|Any CPU.Build.0 = Release|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.DebugLocalBunkum|Any CPU.ActiveCfg = Debug|Any CPU - {4717B220-62C1-4CF9-9734-D9975C462159}.DebugLocalBunkum|Any CPU.Build.0 = Debug|Any CPU {8DC15128-D9C9-498B-AD3B-537C50966C91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DC15128-D9C9-498B-AD3B-537C50966C91}.Debug|Any CPU.Build.0 = Debug|Any CPU {8DC15128-D9C9-498B-AD3B-537C50966C91}.Release|Any CPU.ActiveCfg = Release|Any CPU