using System; using System.Reflection; using HarmonyLib; using MAI2.Util; using Manager; using Net.Packet; using Net.Packet.Mai2; namespace AquaMai.Helpers; public static class Shim { public delegate string GetAccessTokenMethod(int index); public static readonly GetAccessTokenMethod GetAccessToken = new Func(() => { var tOperationManager = Traverse.Create(Singleton.Instance); var tGetAccessToken = tOperationManager.Method("GetAccessToken", [typeof(int)]); if (!tGetAccessToken.MethodExists()) { return (index) => throw new MissingMethodException("No matching OperationManager.GetAccessToken() method found"); } return (index) => tGetAccessToken.GetValue(index); })(); public delegate PacketUploadUserPlaylog PacketUploadUserPlaylogCreator(int index, UserData src, int trackNo, Action onDone, Action onError = null); public static readonly PacketUploadUserPlaylogCreator CreatePacketUploadUserPlaylog = new Func(() => { var type = typeof(PacketUploadUserPlaylog); if (type.GetConstructor([typeof(int), typeof(UserData), typeof(int), typeof(Action), typeof(Action)]) is ConstructorInfo ctor1) { return (index, src, trackNo, onDone, onError) => { var args = new object[] {index, src, trackNo, onDone, onError}; return (PacketUploadUserPlaylog)ctor1.Invoke(args); }; } else if (type.GetConstructor([typeof(int), typeof(UserData), typeof(int), typeof(string), typeof(Action), typeof(Action)]) is ConstructorInfo ctor2) { return (index, src, trackNo, onDone, onError) => { var accessToken = GetAccessToken(index); var args = new object[] {index, src, trackNo, accessToken, onDone, onError}; return (PacketUploadUserPlaylog)ctor2.Invoke(args); }; } else { throw new MissingMethodException("No matching PacketUploadUserPlaylog constructor found"); } })(); public delegate PacketUpsertUserAll PacketUpsertUserAllCreator(int index, UserData src, Action onDone, Action onError = null); public static readonly PacketUpsertUserAllCreator CreatePacketUpsertUserAll = new Func(() => { var type = typeof(PacketUpsertUserAll); if (type.GetConstructor([typeof(int), typeof(UserData), typeof(Action), typeof(Action)]) is ConstructorInfo ctor1) { return (index, src, onDone, onError) => { var args = new object[] {index, src, onDone, onError}; return (PacketUpsertUserAll)ctor1.Invoke(args); }; } else if (type.GetConstructor([typeof(int), typeof(UserData), typeof(string), typeof(Action), typeof(Action)]) is ConstructorInfo ctor2) { return (index, src, onDone, onError) => { var accessToken = GetAccessToken(index); var args = new object[] {index, src, accessToken, onDone, onError}; return (PacketUpsertUserAll)ctor2.Invoke(args); }; } else { throw new MissingMethodException("No matching PacketUpsertUserAll constructor found"); } })(); }