Skip to content

Commit

Permalink
Revert string marshalling on Discord Presence
Browse files Browse the repository at this point in the history
Co-Authored-By: Bagus Nur Listiyono <[email protected]>
  • Loading branch information
neon-nyan and bagusnl committed Jan 19, 2024
1 parent 33164b2 commit bfd55a2
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 85 deletions.
30 changes: 15 additions & 15 deletions Hi3Helper.Core/Classes/DiscordPresence/DiscordPresenceManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,10 @@ public async void SetActivity(ActivityType activity, int delay = 500)
default:
_activity = new Activity
{
Details = Lang._Misc.DiscordRP_Default,
Details = Lang._Misc.DiscordRP_Default.StrToByteUtf8(),
Assets = new ActivityAssets
{
LargeImage = "launcher-logo"
LargeImage = "launcher-logo".StrToByteUtf8()
}
};
break;
Expand All @@ -251,14 +251,14 @@ private void BuildActivityGameStatus(string activityName, bool isGameStatusEnabl
if (_isDisposed) SetupPresence();
_activity = new Activity
{
Details = $"{activityName} {(!isGameStatusEnabled ? ConfigV2Store.CurrentConfigV2GameCategory : null)}",
State = $"{Lang._Misc.DiscordRP_Region} {ConfigV2Store.CurrentConfigV2GameRegion}",
Details = $"{activityName} {(!isGameStatusEnabled ? ConfigV2Store.CurrentConfigV2GameCategory : null)}".StrToByteUtf8(),
State = $"{Lang._Misc.DiscordRP_Region} {ConfigV2Store.CurrentConfigV2GameRegion}".StrToByteUtf8(),
Assets = new ActivityAssets
{
LargeImage = $"game-{ConfigV2Store.CurrentConfigV2.GameType.ToString().ToLower()}-logo",
LargeText = $"{ConfigV2Store.CurrentConfigV2GameCategory} - {ConfigV2Store.CurrentConfigV2GameRegion}",
SmallImage = $"launcher-logo",
SmallText = $"Collapse Launcher v{AppCurrentVersionString} {(IsPreview ? "Preview" : "Stable")}"
LargeImage = $"game-{ConfigV2Store.CurrentConfigV2.GameType.ToString().ToLower()}-logo".StrToByteUtf8(),
LargeText = $"{ConfigV2Store.CurrentConfigV2GameCategory} - {ConfigV2Store.CurrentConfigV2GameRegion}".StrToByteUtf8(),
SmallImage = "launcher-logo".StrToByteUtf8(),
SmallText = $"Collapse Launcher v{AppCurrentVersionString} {(IsPreview ? "Preview" : "Stable")}".StrToByteUtf8()
},
Timestamps = new ActivityTimestamps
{
Expand All @@ -282,21 +282,21 @@ private void BuildActivityAppStatus(string activityName, bool isGameStatusEnable
if (_isDisposed) SetupPresence();
_activity = new Activity
{
Details = activityName,
State = $"{Lang._Misc.DiscordRP_Region} {ConfigV2Store.CurrentConfigV2GameRegion}",
Details = activityName.StrToByteUtf8(),
State = $"{Lang._Misc.DiscordRP_Region} {ConfigV2Store.CurrentConfigV2GameRegion}".StrToByteUtf8(),
Assets = new ActivityAssets
{
LargeImage = $"game-{ConfigV2Store.CurrentConfigV2.GameType.ToString().ToLower()}-logo",
LargeText = $"{ConfigV2Store.CurrentConfigV2GameCategory}",
SmallImage = "launcher-logo",
SmallText = $"Collapse Launcher v{AppCurrentVersionString} {(IsPreview ? "Preview" : "Stable")}"
LargeImage = $"game-{ConfigV2Store.CurrentConfigV2.GameType.ToString().ToLower()}-logo".StrToByteUtf8(),
LargeText = $"{ConfigV2Store.CurrentConfigV2GameCategory}".StrToByteUtf8(),
SmallImage = "launcher-logo".StrToByteUtf8(),
SmallText = $"Collapse Launcher v{AppCurrentVersionString} {(IsPreview ? "Preview" : "Stable")}".StrToByteUtf8()
},
};
}

private void UpdateActivity() => _activityManager?.UpdateActivity(_activity, (a) =>
{
Logger.LogWriteLine($"Activity updated! => {_activity.Details} - {_activity.State}");
Logger.LogWriteLine($"Activity updated! => {_activity.Details.ReadUtf8Byte()} - {_activity.State.ReadUtf8Byte()}");
});

private void UpdateCallbacksRoutine()
Expand Down
9 changes: 0 additions & 9 deletions Hi3Helper.Core/Classes/DiscordPresence/src/Constants.cs

This file was deleted.

119 changes: 58 additions & 61 deletions Hi3Helper.Core/Classes/DiscordPresence/src/Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,31 +211,31 @@ public enum InputModeType
PushToTalk,
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct User
{
public Int64 Id;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Username;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] Username;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
public string Discriminator;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Discriminator;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Avatar;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Avatar;

public bool Bot;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct OAuth2Token
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string AccessToken;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] AccessToken;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public string Scopes;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public byte[] Scopes;

public Int64 Expires;
}
Expand All @@ -256,20 +256,20 @@ public struct ActivityTimestamps
public Int64 End;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct ActivityAssets
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string LargeImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] LargeImage;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string LargeText;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] LargeText;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string SmallImage;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] SmallImage;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string SmallText;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] SmallText;
}

[StructLayout(LayoutKind.Sequential)]
Expand All @@ -280,45 +280,45 @@ public struct PartySize
public Int32 MaxSize;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct ActivityParty
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Id;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Id;

public PartySize Size;

public ActivityPartyPrivacy Privacy;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct ActivitySecrets
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Match;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Match;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Join;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Join;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Spectate;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Spectate;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Activity : IEquatable<Activity>
[StructLayout(LayoutKind.Sequential)]
public struct Activity
{
public ActivityType Type;

public Int64 ApplicationId;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Name;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string State;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] State;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Details;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Details;

public ActivityTimestamps Timestamps;

Expand Down Expand Up @@ -363,7 +363,7 @@ public struct Relationship
public Presence Presence;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct Lobby
{
public Int64 Id;
Expand All @@ -372,8 +372,8 @@ public struct Lobby

public Int64 OwnerId;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Secret;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] Secret;

public UInt32 Capacity;

Expand Down Expand Up @@ -406,11 +406,11 @@ public struct Rect
public Int32 Bottom;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct FileStat
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string Filename;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 260)]
public byte[] Filename;

public UInt64 Size;

Expand All @@ -427,38 +427,38 @@ public struct Entitlement
public Int64 SkuId;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct SkuPrice
{
public UInt32 Amount;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string Currency;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public byte[] Currency;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct Sku
{
public Int64 Id;

public SkuType Type;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] Name;

public SkuPrice Price;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct InputMode
{
public InputModeType Type;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Shortcut;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] Shortcut;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
[StructLayout(LayoutKind.Sequential)]
public struct UserAchievement
{
public Int64 UserId;
Expand All @@ -467,8 +467,8 @@ public struct UserAchievement

public byte PercentComplete;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string UnlockedAt;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] UnlockedAt;
}

[StructLayout(LayoutKind.Sequential)]
Expand Down Expand Up @@ -909,9 +909,6 @@ internal partial struct FFICreateParams
internal UInt32 AchievementVersion;
}

[DllImport(Constants.DllName, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
private static extern Result DiscordCreate(UInt32 version, ref FFICreateParams createParams, out IntPtr manager);

public delegate void SetLogHookHandler(LogLevel level, string message);

private GCHandle SelfHandle;
Expand Down Expand Up @@ -1070,7 +1067,7 @@ public Discord(Int64 clientId, UInt64 flags)
createParams.AchievementEvents = AchievementEventsPtr;
createParams.AchievementVersion = 1;
InitEvents(EventsPtr, ref Events);
var result = DiscordCreate(3, ref createParams, out MethodsPtr);
var result = Extern.DiscordCreate(3, ref createParams, out MethodsPtr);
if (result != Result.Ok)
{
Dispose();
Expand Down
29 changes: 29 additions & 0 deletions Hi3Helper.Core/Classes/DiscordPresence/src/Extern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#if !DISABLEDISCORD
using static Discord.Discord;
using System.Runtime.InteropServices;
using System;
using System.Text;

namespace Discord
{
internal static class Extern
{
public const string DllName = "Lib\\discord_game_sdk";

[DllImport(DllName, CallingConvention = CallingConvention.Winapi, ExactSpelling = true)]
internal static extern Result DiscordCreate(UInt32 version, ref FFICreateParams createParams, out IntPtr manager);

internal static string ReadUtf8Byte(this byte[] input) => input == null || input.Length == 0 ? string.Empty : Encoding.UTF8.GetString(input);

internal static byte[] StrToByteUtf8(this string s, int len = 128)
{
// Use fixed width (provided by len or 128 bytes) as defined in field's SizeConst
byte[] bufferOut = new byte[len];
// Get the UTF-8 bytes (converting 16-bit (UTF-16) to 8-bit (UTF-8) char (as byte))
Encoding.UTF8.GetBytes(s, bufferOut);
// return the buffer
return bufferOut;
}
}
}
#endif

0 comments on commit bfd55a2

Please sign in to comment.