GameSDKcraft/GamecraftRPC/Plugin.cs

239 lines
8.9 KiB
C#
Raw Normal View History

2020-03-26 15:36:06 -04:00
using System;
using System.Reflection;
//using Microsoft.Win32;
2020-03-26 15:36:06 -04:00
using IllusionPlugin;
using GamecraftModdingAPI.App;
2020-03-26 15:36:06 -04:00
using GamecraftModdingAPI.Commands;
using Discord;
namespace GamecraftRPC
{
public class Plugin : IPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin'
{
public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name;
public string Version { get; } =
#if DEBUG
Assembly.GetExecutingAssembly().GetName().Version.ToString() + "alpha";
#else
Assembly.GetExecutingAssembly().GetName().Version.ToString();
#endif
2020-03-26 15:36:06 -04:00
private const long CLIENT_ID =
2020-04-06 17:36:07 -04:00
#if DEBUG
692733325902872619;
#else
696732441012076605;
#endif
private const LogLevel LOG_LEVEL =
#if DEBUG
LogLevel.Debug;
#else
LogLevel.Warn;
2020-04-06 17:36:07 -04:00
#endif
2020-03-26 15:36:06 -04:00
internal static Discord.Discord DiscordRPC;
2020-03-26 15:36:06 -04:00
2020-06-29 20:19:50 -04:00
// called when Gamecraft shuts down
2020-03-26 15:36:06 -04:00
public void OnApplicationQuit()
{
2020-06-29 20:19:50 -04:00
// Shutdown this mod
if (DiscordRPC != null)
{
DiscordRPC.GetActivityManager().ClearActivity((result) => { GamecraftModdingAPI.Utility.Logging.LogDebug($"Cleared status: {result}"); DiscordRPC.Dispose(); });
2020-06-29 20:19:50 -04:00
}
2020-03-26 15:36:06 -04:00
GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has shutdown");
2020-06-29 20:19:50 -04:00
// Shutdown the Gamecraft modding API last
2020-03-26 15:36:06 -04:00
GamecraftModdingAPI.Main.Shutdown();
}
2020-06-29 20:19:50 -04:00
// called when Gamecraft starts up
2020-03-26 15:36:06 -04:00
public void OnApplicationStart()
{
2020-06-29 20:19:50 -04:00
// Initialize the Gamecraft modding API first
2020-03-26 15:36:06 -04:00
GamecraftModdingAPI.Main.Init();
// detect Wine (maybe?)
bool isWineDetected = false;
foreach (var key in Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software").GetSubKeyNames())
{
2020-06-29 20:19:50 -04:00
if (key == "Wine")
{
isWineDetected = true;
break;
}
}
if (isWineDetected)
{
// info for getting this to work through Wine/Proton
GamecraftModdingAPI.Utility.Logging.MetaLog("\n--------------------------------\n\nIt looks like you may be using Wine/Proton, cool!\nPlease install https://github.com/0e4ef622/wine-discord-ipc-bridge to get this to work.\n\n--------------------------------");
}
2020-06-29 20:19:50 -04:00
// Initialize this mod
DiscordRPC = new Discord.Discord(CLIENT_ID, (UInt64)Discord.CreateFlags.NoRequireDiscord);
DiscordRPC.SetLogHook(LOG_LEVEL, (_, msg) => { GamecraftModdingAPI.Utility.Logging.MetaLog(msg); });
//DiscordRPC.GetActivityManager().RegisterSteam(1078000);
2020-04-06 17:36:07 -04:00
ActivityManager am = DiscordRPC.GetActivityManager();
am.OnActivityJoinRequest += CallbackUtility.ActivityJoinRequest;
am.OnActivityJoin += CallbackUtility.ActivityJoin;
am.OnActivityInvite += CallbackUtility.ActivityInvite;
LobbyManager lm = DiscordRPC.GetLobbyManager();
lm.OnMemberConnect += CallbackUtility.DiscordUserJoin;
SetDiscordActivity(state: $"{UnityEngine.Application.version} ({Version})", details: $"Initializing...", start: (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
Game.Edit += CallbackUtility.BuildEnter;
Game.Enter += CallbackUtility.GameEnter;
Game.Simulate += CallbackUtility.SimulationEnter;
Client.EnterMenu += CallbackUtility.MenuEnter;
2020-06-29 20:19:50 -04:00
GamecraftModdingAPI.Utility.GameEngineManager.AddGameEngine(new Engines.PlayerCountEngine());
CommandBuilder.Builder()
.Name("JoinDiscord")
.Description("Join the Exmods server for help or more information")
.Action(() =>
{
if (DiscordRPC != null)
{
DiscordRPC.GetOverlayManager().OpenGuildInvite("2CtWzZT", CallbackUtility.NobodyCares);
}
else
{
GamecraftModdingAPI.Utility.Logging.CommandLogError("Discord GameSDK functionality is unavailable. Please make sure Discord is open when launching Gamecraft.");
}
})
.Build();
CommandBuilder.Builder()
.Name("InviteDiscordUser")
.Description("Invite a Discord user (by id) to your game")
.Action<long>((userId) =>
{
if (DiscordRPC != null)
{
Game game = Game.CurrentGame();
DiscordRPC.GetActivityManager().SendInvite(userId, Discord.ActivityActionType.Join, $"Let's play Gamecraft together! (requires the GamecraftRPC mod)", CallbackUtility.NobodyCares);
}
else
{
GamecraftModdingAPI.Utility.Logging.CommandLogError("Discord GameSDK functionality is unavailable. Please make sure Discord is open when launching Gamecraft.");
}
})
.Build();
2020-04-06 17:36:07 -04:00
CommandBuilder.Builder()
.Name(Name + "Info")
.Description("Build information for the GamecraftRPC mod.")
.Action(() =>
{
if (DiscordRPC != null)
2020-06-29 20:19:50 -04:00
{
Game game = Game.CurrentGame();
Client client = new Client();
GamecraftModdingAPI.Utility.Logging.CommandLog($"Gamecraft {client.Version}\nUnity {client.UnityVersion}\n{Name} {Version}\nSDK {DiscordRPC.ToString()}\nGame {game.Name}");
2020-06-29 20:19:50 -04:00
}
else
{
GamecraftModdingAPI.Utility.Logging.CommandLogError("Discord GameSDK functionality is unavailable. Please make sure Discord is open when launching Gamecraft.");
}
})
.Build();
2020-06-29 20:19:50 -04:00
#if !RELEASE
bool alreadyWarned = false;
Client.EnterMenu += (_, args) =>
{
if (alreadyWarned) return;
//GamecraftModdingAPI.Utility.Logging.LogDebug($"Displaying {Name} {Version} DEBUG warning");
/*
RobocraftX.Services.ErrorBuilder.DisplayCustomError(
$"THIS IS NOT ACTUALLY AN ERROR! {Name} v{Version} is a pre-release. If you encounter a bug or other issue, please report it to NGnius or Exmods on Discord.",
"Discord", () => { UnityEngine.Application.OpenURL("https://discord.exmods.org"); },
"Ok!", () => { GamecraftModdingAPI.Utility.Logging.LogDebug($"Dismissed {Name} {Version} DEBUG warning"); }
);
*/
RobocraftX.Services.ErrorBuilder.DisplayWarning($"{Name} v{Version} is a pre-release. If you encounter a bug or other issue, please report it to NGnius or Exmods on Discord.");
alreadyWarned = true;
};
#endif
2020-03-26 15:36:06 -04:00
GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has started up");
}
public void OnFixedUpdate() { } // called once per physics update
public void OnLevelWasInitialized(int level) { } // called after a level is initialized
public void OnLevelWasLoaded(int level) { } // called after a level is loaded
public void OnUpdate() // called once per rendered frame (frame update)
{
if (DiscordRPC != null ) DiscordRPC.RunCallbacks();
2020-03-26 15:36:06 -04:00
}
public static void SetDiscordActivity(string state = null, string details = null, long start = 0, long end = 0, string largeImg = "gamecraft-logo-g", string largeTxt = "Gamecraft", string smallImg = "exmods-logo-xm2", string smallTxt = "Exmods", string partyId = null, int partyCurrentSize = 0, int partyMaxSize = 0, string matchSecret = null, string joinSecret = null, string spectateSecret = null, bool instance = true, string debug = "")
2020-03-26 15:36:06 -04:00
{
if (DiscordRPC == null) return;
2020-03-26 15:36:06 -04:00
2020-04-06 17:36:07 -04:00
ref Activity activity = ref PresenceUtility.Activity;
activity.Instance = instance;
2020-03-26 15:36:06 -04:00
if (state != null) activity.State = state;
if (details != null) activity.Details = details;
if (start != 0) activity.Timestamps.Start = start;
if (end != 0) activity.Timestamps.End = end;
if (!string.IsNullOrEmpty(largeImg))
{
activity.Assets.LargeImage = largeImg;
activity.Assets.LargeText = largeTxt;
}
if (!string.IsNullOrEmpty(smallImg))
{
activity.Assets.SmallImage = smallImg;
activity.Assets.SmallText = smallTxt;
}
2020-04-06 17:36:07 -04:00
if (!string.IsNullOrEmpty(partyId))
{
activity.Party.Id = partyId;
activity.Party.Size.CurrentSize = partyCurrentSize;
activity.Party.Size.MaxSize = partyMaxSize;
}
if (!string.IsNullOrEmpty(matchSecret) || !string.IsNullOrEmpty(joinSecret) || !string.IsNullOrEmpty(spectateSecret))
{
activity.Secrets.Match = matchSecret;
activity.Secrets.Join = joinSecret;
activity.Secrets.Spectate = spectateSecret;
}
2020-03-26 15:36:06 -04:00
DiscordRPC.GetActivityManager().UpdateActivity(activity, result =>
2020-03-26 15:36:06 -04:00
{
2020-04-06 17:36:07 -04:00
GamecraftModdingAPI.Utility.Logging.MetaLog($"Update Activity Result: {result} {debug}");
});
}
public static void SetDiscordActivity(Discord.Activity activity, string debug = "")
2020-04-06 17:36:07 -04:00
{
if (DiscordRPC == null) return;
2020-04-06 17:36:07 -04:00
PresenceUtility.Activity = activity;
DiscordRPC.GetActivityManager().UpdateActivity(PresenceUtility.Activity, result =>
2020-04-06 17:36:07 -04:00
{
GamecraftModdingAPI.Utility.Logging.MetaLog($"Update Activity Result: {result} {debug}");
});
}
public static void SetDiscordActivity(string debug = "")
2020-04-06 17:36:07 -04:00
{
if (DiscordRPC == null) return;
DiscordRPC.GetActivityManager().UpdateActivity(PresenceUtility.Activity, result =>
2020-04-06 17:36:07 -04:00
{
GamecraftModdingAPI.Utility.Logging.MetaLog($"Update Activity Result: {result} {debug}");
2020-03-26 15:36:06 -04:00
});
}
}
}