Skip to content

Commit

Permalink
Merge pull request #26 from Folleach/features/account-message
Browse files Browse the repository at this point in the history
Create methods for create and read in game messages
  • Loading branch information
Folleach authored Sep 3, 2023
2 parents 6357a5d + 3a54b32 commit bf2088d
Show file tree
Hide file tree
Showing 10 changed files with 206 additions and 3 deletions.
37 changes: 37 additions & 0 deletions GeometryDashAPI.Tests/MessageTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Linq;
using FluentAssertions;
using GeometryDashAPI.Server.Dtos;
using NUnit.Framework;

namespace GeometryDashAPI.Tests;

[TestFixture]
public class MessageTests
{
[Test]
public void DecryptMessage()
{
var message = Message.FromRaw("SGVsbG8sIGl0J3MgbGlicmFyeSB0ZXN0IHRpbWU=", "eBNEUBFbQUFBEUddV0IRX1FGQl5DXxJFUFJfV0FCHRRWWl8WQBJeVFREEkxeRBRfXF9V");

message.Should().BeEquivalentTo(new Message()
{
Subject = "Hello, it's library test time",
Body = "I've just view network packets, don't keep you mind"
});
}

[Test]
public void EncryptMessage()
{
var message = new Message()
{
Subject = "Hello, it's library test time",
Body = "I've just view network packets, don't keep you mind"
};

var parameters = message.BuildQuery();

parameters.FirstOrDefault(x => x.Key == "subject").Value.Should().BeEquivalentTo("SGVsbG8sIGl0J3MgbGlicmFyeSB0ZXN0IHRpbWU=");
parameters.FirstOrDefault(x => x.Key == "body").Value.Should().BeEquivalentTo("eBNEUBFbQUFBEUddV0IRX1FGQl5DXxJFUFJfV0FCHRRWWl8WQBJeVFREEkxeRBRfXF9V");
}
}
3 changes: 2 additions & 1 deletion GeometryDashAPI/Server/Dtos/Account.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using GeometryDashAPI.Attributes;
using GeometryDashAPI.Server.Enums;

namespace GeometryDashAPI.Server.Dtos
{
Expand All @@ -20,7 +21,7 @@ public class Account : GameObject
[GameProperty("15")] public int Special { get; set; }
[GameProperty("16")] public int AccountId { get; set; }
[GameProperty("17")] public int UserCoins { get; set; }
[GameProperty("18")] public int MessageState { get; set; }
[GameProperty("18")] public AllowMessagesFrom MessageState { get; set; }
[GameProperty("19")] public int FriendsState { get; set; }
[GameProperty("20")] public string YouTubeId { get; set; }
[GameProperty("21")] public int CubeId { get; set; }
Expand Down
40 changes: 40 additions & 0 deletions GeometryDashAPI/Server/Dtos/Message.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Text;

namespace GeometryDashAPI.Server.Dtos;

public class Message : IQuery
{
private static readonly string BodyXorKey = "14251";

public string Subject { get; set; }
public string Body { get; set; }

public static Message FromRaw(string subject, string body)
{
return new Message()
{
Subject = DeserializeSubject(subject),
Body = DeserializeBody(body)
};
}

public Parameters BuildQuery()
{
var parameters = new Parameters();
BuildQuery(parameters);
return parameters;
}

public void BuildQuery(Parameters parameters)
{
parameters.Add(new Property("subject", SerializeSubject(Subject)));
parameters.Add(new Property("body", SerializeBody(Body)));
}

internal static string DeserializeSubject(string raw) => Encoding.UTF8.GetString(Convert.FromBase64String(raw));
internal static string SerializeSubject(string subject) => Convert.ToBase64String(Encoding.ASCII.GetBytes(subject));

internal static string DeserializeBody(string raw) => Crypt.XOR(Encoding.UTF8.GetString(Convert.FromBase64String(raw)), BodyXorKey);
internal static string SerializeBody(string body) => Convert.ToBase64String(Encoding.ASCII.GetBytes(Crypt.XOR(body, BodyXorKey)));
}
22 changes: 22 additions & 0 deletions GeometryDashAPI/Server/Dtos/MessageContent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using GeometryDashAPI.Attributes;

namespace GeometryDashAPI.Server.Dtos;

[Sense(":")]
public class MessageContent : MessagePreview
{
[GameProperty("5")]
private string body;

public string Body
{
get => Message.DeserializeBody(body);
set => Message.SerializeBody(value);
}

public Message Message => new()
{
Body = Message.DeserializeBody(body),
Subject = Subject
};
}
39 changes: 39 additions & 0 deletions GeometryDashAPI/Server/Dtos/MessagePreview.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using GeometryDashAPI.Attributes;

namespace GeometryDashAPI.Server.Dtos;

[Sense(":")]
public class MessagePreview : GameObject
{
[GameProperty("1")]
public int MessageId { get; set; }

[GameProperty("2")]
public int SenderAccountId { get; set; }

[GameProperty("3")]
public int SenderUserId { get; set; }

[GameProperty("4")]
private string subject;

public string Subject
{
get => Message.DeserializeSubject(subject);
set => Message.SerializeSubject(value);
}

[GameProperty("6")]
public string SenderUserName { get; set; }

[GameProperty("7")]
public string Time { get; set; }

[GameProperty("8")]
public bool HasBeenRead { get; set; }

public override string ToString()
{
return $"Letter '{Subject}' from {SenderUserName}({SenderAccountId})";
}
}
8 changes: 8 additions & 0 deletions GeometryDashAPI/Server/Enums/AllowMessagesFrom.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace GeometryDashAPI.Server.Enums;

public enum AllowMessagesFrom
{
All = 0,
Friends = 1,
None = 2
}
34 changes: 34 additions & 0 deletions GeometryDashAPI/Server/GameClient.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using GeometryDashAPI.Server.Enums;
using GeometryDashAPI.Server.Queries;
using System;
using System.Net;
using System.Threading.Tasks;
using GeometryDashAPI.Attributes;
using GeometryDashAPI.Server.Dtos;
using GeometryDashAPI.Server.Responses;

namespace GeometryDashAPI.Server
Expand Down Expand Up @@ -114,6 +116,38 @@ public async Task<ServerResponse<LevelPageResponse>> GetMyLevelsAsync(PasswordQu
return await Get<LevelPageResponse>("/getGJLevels21.php", query);
}

public async Task<ServerResponse<NoneResponse>> SendMessageAsync(PasswordQuery fromAccount, int toAccountId, Message message)
{
var query = new FlexibleQuery()
.AddToChain(GetOnlineQuery())
.AddToChain(fromAccount)
.AddProperty(new Property("toAccountID", toAccountId))
.AddToChain(message);

return await Get<NoneResponse>("/uploadGJMessage20.php", query);
}

public Task<ServerResponse<MessagesPageResponse>> GetMessagesAsync(PasswordQuery account, int page)
{
var query = new FlexibleQuery()
.AddToChain(GetOnlineQuery())
.AddToChain(account)
.AddProperty(new Property("page", page))
.AddProperty(new Property("total", 0));

return Get<MessagesPageResponse>("/getGJMessages20.php", query);
}

public Task<ServerResponse<MessageContent>> ReadMessageAsync(PasswordQuery account, int messageId)
{
var query = new FlexibleQuery()
.AddToChain(GetOnlineQuery())
.AddToChain(account)
.AddProperty(new Property("messageID", messageId));

return Get<MessageContent>("/downloadGJMessage20.php", query);
}

private async Task<ServerResponse<T>> Get<T>(string path, IQuery query) where T : IGameObject
{
var (statusCode, body) = await network.GetAsync(path, query);
Expand Down
4 changes: 2 additions & 2 deletions GeometryDashAPI/Server/Pagination.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ public static Pagination Parse(string raw)
var parser = new LLParserSpan(":".AsSpan(), raw.AsSpan());
var result = new Pagination();
#if NETSTANDARD2_1
result.TotalCount = int.Parse(parser.Next());
result.TotalCount = int.TryParse(parser.Next(), out var total) ? total : 0;
result.RangeIn = int.Parse(parser.Next());
result.RangeOut = int.Parse(parser.Next());
#else
result.TotalCount = int.Parse(parser.Next().ToString());
result.TotalCount = int.TryParse(parser.Next().ToString(), out var total) ? total : 0;
result.RangeIn = int.Parse(parser.Next().ToString());
result.RangeOut = int.Parse(parser.Next().ToString());
#endif
Expand Down
17 changes: 17 additions & 0 deletions GeometryDashAPI/Server/Responses/MessagesPageResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System.Collections.Generic;
using GeometryDashAPI.Attributes;
using GeometryDashAPI.Server.Dtos;

namespace GeometryDashAPI.Server.Responses;

[AsStruct]
[Sense("#")]
public class MessagesPageResponse : GameObject
{
[GameProperty("0")]
[ArraySeparator("|")]
public List<MessagePreview> Messages { get; set; }

[GameProperty("1")]
public Pagination Page { get; set; }
}
5 changes: 5 additions & 0 deletions GeometryDashAPI/Server/Responses/NoneResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace GeometryDashAPI.Server.Responses;

public class NoneResponse : GameObject
{
}

0 comments on commit bf2088d

Please sign in to comment.