Commit c2dcb501 authored by SherryChaos's avatar SherryChaos

update mycard u16Secret

parent d18d30e8
...@@ -389,19 +389,19 @@ namespace MDPro3.Net ...@@ -389,19 +389,19 @@ namespace MDPro3.Net
JoinPrivate = 5, JoinPrivate = 5,
} }
public static string GetJoinRoomPassword(MyCardRoomOptions options, string roomId, int userId, bool _private = false) public static async UniTask<string> GetJoinRoomPassword(MyCardRoomOptions options, string roomId, int userId, bool _private = false)
{ {
byte[] optionsBuffer = new byte[6]; byte[] optionsBuffer = new byte[6];
optionsBuffer[1] = (byte)((_private ? (int)RoomAction.JoinPrivate : (int)RoomAction.JoinPublic) << 4); optionsBuffer[1] = (byte)((_private ? (int)RoomAction.JoinPrivate : (int)RoomAction.JoinPublic) << 4);
EncryptBuffer(optionsBuffer, userId); await EncryptBuffer(optionsBuffer);
string base64String = Convert.ToBase64String(optionsBuffer); string base64String = Convert.ToBase64String(optionsBuffer);
return base64String + roomId; return base64String + roomId;
} }
public static string GetCreateRoomPasswd(MyCardRoomOptions options, string roomID, int userId, bool _private = false) public static async Task<string> GetCreateRoomPasswd(MyCardRoomOptions options, string roomID, int userId, bool _private = false)
{ {
byte[] optionsBuffer = new byte[6]; byte[] optionsBuffer = new byte[6];
optionsBuffer[1] = (byte)(((byte)(_private ? RoomAction.CreatePrivate : RoomAction.CreatePublic) << 4) | (byte)(options.duel_rule << 1) | (options.auto_death ? 0x1 : 0)); optionsBuffer[1] = (byte)(((byte)(_private ? RoomAction.CreatePrivate : RoomAction.CreatePublic) << 4) | (byte)(options.duel_rule << 1) | (options.auto_death ? 0x1 : 0));
...@@ -410,13 +410,13 @@ namespace MDPro3.Net ...@@ -410,13 +410,13 @@ namespace MDPro3.Net
WriteUInt16LE(optionsBuffer, 3, (ushort)options.start_lp); WriteUInt16LE(optionsBuffer, 3, (ushort)options.start_lp);
optionsBuffer[5] = (byte)(((byte)options.start_hand << 4) | options.draw_count); optionsBuffer[5] = (byte)(((byte)options.start_hand << 4) | options.draw_count);
EncryptBuffer(optionsBuffer, userId); await EncryptBuffer(optionsBuffer);
string base64String = Convert.ToBase64String(optionsBuffer); string base64String = Convert.ToBase64String(optionsBuffer);
return base64String + roomID; return base64String + roomID;
} }
private static void EncryptBuffer(byte[] buffer, int external_id) private static async UniTask EncryptBuffer(byte[] buffer)
{ {
int checksum = 0; int checksum = 0;
...@@ -427,7 +427,8 @@ namespace MDPro3.Net ...@@ -427,7 +427,8 @@ namespace MDPro3.Net
buffer[0] = (byte)(checksum & 0xff); buffer[0] = (byte)(checksum & 0xff);
int secret = (external_id % 65535) + 1; var u16Secret = await GetUserU16SecretAsync();
int secret = u16Secret % 65535 + 1;
for (int i = 0; i < buffer.Length; i += 2) for (int i = 0; i < buffer.Length; i += 2)
{ {
...@@ -453,6 +454,56 @@ namespace MDPro3.Net ...@@ -453,6 +454,56 @@ namespace MDPro3.Net
buffer[offset + 1] = (byte)((value >> 8) & 0xff); buffer[offset + 1] = (byte)((value >> 8) & 0xff);
} }
[Serializable]
private class AuthResponse
{
public int u16Secret;
}
private static async UniTask<int> GetUserU16SecretAsync()
{
static void Bad(string message)
{
MessageManager.Cast(InterString.Get("MyCard: 获取用户密钥失败。请重新登录。([?])", message));
throw new Exception($"Get U16 secret failed: {message}");
}
if(account == null)
Bad("No account info");
if (string.IsNullOrEmpty(account.token))
Bad("no token");
var token = account.token;
var url = authUrl;
using var request = UnityWebRequest.Get(url);
request.SetRequestHeader("Authorization", $"Bearer {token}");
request.SetRequestHeader("Content-Type", "application/json");
await request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Bad(request.error);
return 0;
}
try
{
var jsonResponse = request.downloadHandler.text;
var authInfo = JsonUtility.FromJson<AuthResponse>(jsonResponse);
if (authInfo == null || authInfo.u16Secret == 0)
{
Bad("no secret or invalid response");
return 0;
}
return authInfo.u16Secret;
}
catch (Exception e)
{
Bad(e.ToString());
return 0;
}
}
#endregion #endregion
} }
......
...@@ -52,7 +52,12 @@ namespace MDPro3.UI ...@@ -52,7 +52,12 @@ namespace MDPro3.UI
{ {
AudioManager.PlaySE("SE_MENU_DECIDE"); AudioManager.PlaySE("SE_MENU_DECIDE");
base.CallSubmitEvent(); base.CallSubmitEvent();
var password = MyCard.GetJoinRoomPassword(options, roomId, MyCard.account.user.id); _ = WaitPasswordToJoin();
}
private async UniTask WaitPasswordToJoin()
{
var password = await MyCard.GetJoinRoomPassword(options, roomId, MyCard.account.user.id);
TcpHelper.LinkStart(MyCard.duelUrl, MyCard.account.user.username, MyCard.athleticPort.ToString(), password, false, null); TcpHelper.LinkStart(MyCard.duelUrl, MyCard.account.user.username, MyCard.athleticPort.ToString(), password, false, null);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment