Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
f006023
Added data-structures for REST API
budgetdevv Apr 17, 2024
15a093c
Added MessagePollAnswer.Id
budgetdevv Apr 17, 2024
73c758a
Added MessagePollAnswerCount.cs and MessagePollResults.cs
budgetdevv Apr 17, 2024
3188942
Avoid hiding JsonEntity.Id, renamed to AnswerId
budgetdevv Apr 17, 2024
44514ac
Made some properties `required`
budgetdevv Apr 17, 2024
d3e400c
- Removed MessagePollBase.cs ( Kuba said send / receive shouldn't mix )
budgetdevv Apr 17, 2024
429ea12
Get rid of required keyword
budgetdevv Apr 17, 2024
267ef99
- Added JsonMessagePollAnswerCount.cs
budgetdevv Apr 17, 2024
9994050
Get rid of null! usage
budgetdevv Apr 17, 2024
b5ba61c
Fixed formatting
budgetdevv Apr 17, 2024
13586cf
- Remove required keyword, suppress using null! ( Rider seems to comp…
budgetdevv Apr 17, 2024
2e315cc
- Added MessagePoll.Results
budgetdevv Apr 17, 2024
b0935b4
Don't use null!
budgetdevv Apr 17, 2024
7520a04
Added MessagePollMediaProperties.cs and MessagePollAnswerProperties.cs
budgetdevv Apr 17, 2024
7233eae
Added constructor to MessagePollAnswerProperties.cs
budgetdevv Apr 17, 2024
0ec3f2d
Optimize namespace
budgetdevv Apr 17, 2024
4eac4c0
Added comments
budgetdevv Apr 17, 2024
01f0810
Added RestClient.Undocumented.ExpirePollAsync(). Not too sure if it w…
budgetdevv Apr 17, 2024
e5e0b78
Removed property in JsonMessagePollResults.cs
budgetdevv Apr 18, 2024
b514da3
Removed initializer
budgetdevv Apr 18, 2024
e98a32f
Removed MessagePoll's setters
budgetdevv Apr 18, 2024
cfbf103
Read values from JsonModel instead of storing them
budgetdevv Apr 18, 2024
ce54d61
Removed SetsRequiredMembers attribute
budgetdevv Apr 18, 2024
d0802d0
- Convert more constructors to primary ones.
budgetdevv Apr 18, 2024
20db56e
MessagePoll.cs:
budgetdevv Apr 18, 2024
a070dae
Prefer IEnumerable over array.
budgetdevv Apr 18, 2024
6d834de
Removed redundant partial keyword
budgetdevv Apr 18, 2024
ab2643e
Revert change to IReadOnlyList
budgetdevv Apr 18, 2024
8ee04f0
Use IReadOnlyList
budgetdevv Apr 18, 2024
5d3e369
Fixed JsonMessagePollResults.cs
budgetdevv Apr 18, 2024
aceb052
Revert back to IReadOnlyList for MessagePollResults.Answers, it seems…
budgetdevv Apr 18, 2024
db3c355
Made AnswerId a uint
budgetdevv Apr 19, 2024
6ad8d6a
Renamed ExpireAt to ExpiresAt for consistency
budgetdevv Apr 19, 2024
64107c9
AnswerId is now a uint for MessagePollAnswer.cs ( And its JSON variant )
budgetdevv Apr 19, 2024
014772c
It seems like MessagePollResults.Answers is is not nullable. An empty…
budgetdevv Apr 19, 2024
dd2a05d
AnswerId should be uint
budgetdevv Apr 19, 2024
4161b6e
It seems like this is only sent via gateway, commenting out for now...
budgetdevv Apr 19, 2024
2d1db6a
Fixed RestMessage.ExpirePollAsync() ( Hopefully )
budgetdevv Apr 19, 2024
eff9175
Make MessagePollProperties.LayoutType nullable.
budgetdevv Apr 19, 2024
ca75062
Re-included MessagePollResults.ContainsAnswers
budgetdevv Apr 19, 2024
43a66e4
Made ids signed integer
budgetdevv Apr 19, 2024
618cc09
Optimize namespace
budgetdevv Apr 19, 2024
77549ee
Added InteractionMessageProperties.Poll
budgetdevv Apr 19, 2024
564dfcf
- Implemented RestMessage.GetPollAnswerVoters() ( Need to figure out …
budgetdevv Apr 19, 2024
67f9876
- Added JsonGetPollAnswerVotersResult.cs
budgetdevv Apr 19, 2024
eb4e1d3
Made afterUserId an optional parameter
budgetdevv Apr 19, 2024
a65e33f
Default DurationInHours to 1 ( Via optional ctor param )
budgetdevv Apr 19, 2024
acf5846
Fixed HttpMethod for RestMessage.GetPollAnswerVotersAsync() ( How doe…
budgetdevv Apr 19, 2024
de9f793
Added convenience API for constructing MessagePollAnswerProperties.cs
budgetdevv Apr 19, 2024
6b65212
Made params in primary ctor optional
budgetdevv Apr 19, 2024
dbef41a
Merge branch 'NetCordDev:alpha' into polls
budgetdevv Apr 29, 2024
ea917d7
Added MESSAGE_POLL_VOTE_ADD and MESSAGE_POLL_VOTE_REMOVE gateway even…
budgetdevv May 6, 2024
bbf4fd1
Added poll intents, made intents less complicated
budgetdevv May 6, 2024
03d0345
Added Poll field to WebhookMessageProperties.cs
budgetdevv May 6, 2024
22e617d
Merge branch 'NetCordDev:alpha' into polls
budgetdevv May 11, 2024
8e9c1c0
Adapt [GenerateAlias] to new NetCord commit
budgetdevv May 12, 2024
2105555
Added Poll property to IPartialMessage / PartialMessage
budgetdevv May 12, 2024
21ff69a
Source generate ExpirePollAsync() and GetPollAnswerVotersAsync() for …
budgetdevv May 12, 2024
9a2ecda
Message poll results are nullable
budgetdevv May 12, 2024
e73720a
Improvements
KubaZ2 Jul 8, 2024
c1cbfd9
Merge branch 'alpha' into polls
KubaZ2 Jul 8, 2024
3d31888
Work
KubaZ2 Jul 9, 2024
5dabdc0
Cleanup
KubaZ2 Jul 9, 2024
4662f06
Delete a comment
KubaZ2 Jul 9, 2024
3008a9b
Add missing `GenerateAliasAttribute`s
KubaZ2 Jul 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions NetCord/JsonModels/JsonMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,7 @@ public class JsonMessage : JsonEntity

[JsonPropertyName("resolved")]
public JsonInteractionResolvedData? ResolvedData { get; set; }

[JsonPropertyName("poll")]
public JsonMessagePoll? Poll { get; set; }
}
25 changes: 25 additions & 0 deletions NetCord/JsonModels/JsonMessagePoll.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Text.Json.Serialization;

namespace NetCord.JsonModels;

public class JsonMessagePoll : JsonEntity
{
[JsonPropertyName("question")]
public JsonMessagePollMedia Question { get; set; }

[JsonPropertyName("answers")]
public JsonMessagePollAnswer[] Answers { get; set; }

[JsonPropertyName("allow_multiselect")]
public bool AllowMultiselect { get; set; }

[JsonPropertyName("layout_type")]
public MessagePollLayoutType LayoutType { get; set; }

// Non-expiring posts are possible in the future, see: https://github.com/discord/discord-api-docs/blob/e4bdf50f11f9ca61ace2636285e029a2b3dfd0ec/docs/resources/Poll.md#poll-object
[JsonPropertyName("expiry")]
public DateTimeOffset? ExpireAt { get; set; }
Comment thread
budgetdevv marked this conversation as resolved.
Outdated

[JsonPropertyName("results")]
public JsonMessagePollResults Results { get; set; }
}
12 changes: 12 additions & 0 deletions NetCord/JsonModels/JsonMessagePollAnswer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace NetCord.JsonModels;

public class JsonMessagePollAnswer : JsonEntity
{
[JsonPropertyName("answer_id")]
public ulong AnswerId { get; set; }

[JsonPropertyName("poll_media")]
public JsonMessagePollMedia PollMedia { get; set; }
}
12 changes: 12 additions & 0 deletions NetCord/JsonModels/JsonMessagePollAnswerCount.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace NetCord.JsonModels;

public class JsonMessagePollAnswerCount : JsonEntity
Comment thread
KubaZ2 marked this conversation as resolved.
Outdated
{
[JsonPropertyName("count")]
public int Count { get; set; }

[JsonPropertyName("me_voted")]
public bool MeVoted { get; set; }
}
13 changes: 13 additions & 0 deletions NetCord/JsonModels/JsonMessagePollMedia.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;

namespace NetCord.JsonModels;

public class JsonMessagePollMedia : JsonEntity
{
// Despite this being nullable, it should never be null. Discord is weird...
[JsonPropertyName("text")]
public string? Text { get; set; }

[JsonPropertyName("emoji")]
public JsonEmoji? Emoji { get; set; }
}
12 changes: 12 additions & 0 deletions NetCord/JsonModels/JsonMessagePollResults.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace NetCord.JsonModels;

public class JsonMessagePollResults : JsonEntity
{
[JsonPropertyName("is_finalized")]
public bool IsFinalized { get; set; }

[JsonPropertyName("answer_counts")]
public JsonMessagePollAnswerCount[]? Answers { get; set; }
}
18 changes: 18 additions & 0 deletions NetCord/MessagePoll.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Collections.Immutable;

using NetCord.JsonModels;
using NetCord.Rest;

namespace NetCord;

public class MessagePoll(JsonMessagePoll jsonModel, ulong guildId, RestClient client) : IJsonModel<JsonMessagePoll>
{
JsonMessagePoll IJsonModel<JsonMessagePoll>.JsonModel => jsonModel;
public MessagePollMedia Question = new(jsonModel.Question, guildId, client);
public IReadOnlyList<MessagePollAnswer> Answers = jsonModel.Answers.Select(x => new MessagePollAnswer(x, guildId, client)).ToArray();
public bool AllowMultiselect => jsonModel.AllowMultiselect;
public MessagePollLayoutType LayoutType => jsonModel.LayoutType;
// Non-expiring posts are possible in the future, see: https://github.com/discord/discord-api-docs/blob/e4bdf50f11f9ca61ace2636285e029a2b3dfd0ec/docs/resources/Poll.md#poll-object
public DateTimeOffset? ExpireAt => jsonModel.ExpireAt;
Comment thread
budgetdevv marked this conversation as resolved.
Outdated
public MessagePollResults Results = new(jsonModel.Results);
}
11 changes: 11 additions & 0 deletions NetCord/MessagePollAnswer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using NetCord.JsonModels;
using NetCord.Rest;

namespace NetCord;

public class MessagePollAnswer(JsonMessagePollAnswer jsonModel, ulong guildId, RestClient client) : IJsonModel<JsonMessagePollAnswer>
{
JsonMessagePollAnswer IJsonModel<JsonMessagePollAnswer>.JsonModel => jsonModel;
public ulong AnswerId => jsonModel.AnswerId;
public MessagePollMedia PollMedia { get; } = new(jsonModel.PollMedia, guildId, client);
}
11 changes: 11 additions & 0 deletions NetCord/MessagePollAnswerCount.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using NetCord.JsonModels;

namespace NetCord;

public class MessagePollAnswerCount(JsonMessagePollAnswerCount jsonModel) : IJsonModel<JsonMessagePollAnswerCount>
{
JsonMessagePollAnswerCount IJsonModel<JsonMessagePollAnswerCount>.JsonModel => jsonModel;
public ulong AnswerId => jsonModel.Id;
public int Count => jsonModel.Count;
public bool MeVoted => jsonModel.MeVoted;
}
12 changes: 12 additions & 0 deletions NetCord/MessagePollAnswerProperties.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;

namespace NetCord;

public partial class MessagePollAnswerProperties(MessagePollMediaProperties pollMedia)
{
[JsonPropertyName("answer_id")]
public ulong AnswerId { get; set; }

[JsonPropertyName("poll_media")]
public MessagePollMediaProperties PollMedia { get; set; } = pollMedia;
}
6 changes: 6 additions & 0 deletions NetCord/MessagePollLayoutType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace NetCord;

public enum MessagePollLayoutType
{
Default = 1,
}
18 changes: 18 additions & 0 deletions NetCord/MessagePollMedia.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using NetCord.JsonModels;
using NetCord.Rest;

namespace NetCord;

public class MessagePollMedia(JsonMessagePollMedia jsonModel) : IJsonModel<JsonMessagePollMedia>
{
JsonMessagePollMedia IJsonModel<JsonMessagePollMedia>.JsonModel => jsonModel;
public string? Text => jsonModel.Text;
public Emoji? Emoji { get; }

public MessagePollMedia(JsonMessagePollMedia jsonModel, ulong guildId, RestClient client) : this(jsonModel)
{
var emoji = jsonModel.Emoji;
if (emoji != null)
Emoji = Emoji.CreateFromJson(emoji, guildId, client);
}
}
13 changes: 13 additions & 0 deletions NetCord/MessagePollMediaProperties.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;

namespace NetCord;

public partial class MessagePollMediaProperties
{
// Despite this being nullable, it should never be null. Discord is weird...
[JsonPropertyName("text")]
public string? Text { get; set; }

[JsonPropertyName("emoji")]
public EmojiProperties? Emoji { get; set; }
}
21 changes: 21 additions & 0 deletions NetCord/MessagePollProperties.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Text.Json.Serialization;

namespace NetCord;

public partial class MessagePollProperties(MessagePollMediaProperties question, IEnumerable<MessagePollAnswerProperties> answers)
{
[JsonPropertyName("question")]
public MessagePollMediaProperties Question { get; set; } = question;

[JsonPropertyName("answers")]
public IEnumerable<MessagePollAnswerProperties> Answers { get; set; } = answers;

[JsonPropertyName("allow_multiselect")]
public bool AllowMultiselect { get; set; }

[JsonPropertyName("layout_type")]
public MessagePollLayoutType LayoutType { get; set; }

[JsonPropertyName("duration")]
public int DurationInHours { get; set; }
}
11 changes: 11 additions & 0 deletions NetCord/MessagePollResults.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using NetCord.JsonModels;

namespace NetCord;

public class MessagePollResults(JsonMessagePollResults jsonModel) : IJsonModel<JsonMessagePollResults>
{
JsonMessagePollResults IJsonModel<JsonMessagePollResults>.JsonModel => jsonModel;
public bool IsFinalized => jsonModel.IsFinalized;
public IReadOnlyList<MessagePollAnswerCount>? Answers = jsonModel.Answers?.Select(x => new MessagePollAnswerCount(x)).ToArray();
Comment thread
budgetdevv marked this conversation as resolved.
Outdated
public bool ContainsAnswers => Answers != null;
}
4 changes: 4 additions & 0 deletions NetCord/Rest/MessageProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ public partial class MessageProperties : IHttpSerializable
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
[JsonPropertyName("flags")]
public MessageFlags? Flags { get; set; }

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
[JsonPropertyName("poll")]
public MessagePollProperties? Poll { get; set; }

public HttpContent Serialize()
{
Expand Down
9 changes: 9 additions & 0 deletions NetCord/Rest/RestClient.Undocumented.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,13 @@ public IAsyncEnumerable<GuildUserInfo> SearchGuildUsersAsync(ulong guildId, Guil
new(guildId),
properties);
}

[GenerateAlias(typeof(RestMessage), nameof(RestMessage.Id))]
Comment thread
KubaZ2 marked this conversation as resolved.
Outdated
[GenerateAlias(typeof(TextChannel), nameof(TextChannel.Id))]
public async Task<RestMessage> ExpirePollAsync(ulong messageId, ulong channelId, RestRequestProperties? properties = null)
Comment thread
KubaZ2 marked this conversation as resolved.
Outdated
{
var stream = await SendRequestAsync(HttpMethod.Post, $"/channels/{channelId}/polls/{messageId}/expire").ConfigureAwait(false);

return new(await stream.ToObjectAsync(Serialization.Default.JsonMessage).ConfigureAwait(false), this);
}
}
5 changes: 5 additions & 0 deletions NetCord/Rest/RestMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ public RestMessage(NetCord.JsonModels.JsonMessage jsonModel, RestClient client)
var resolvedData = jsonModel.ResolvedData;
if (resolvedData is not null)
ResolvedData = new(resolvedData, jsonModel.GuildId, client);

var poll = jsonModel.Poll;
if (poll is not null)
Poll = new(poll, jsonModel.GuildId.GetValueOrDefault(), client);
}

public override ulong Id => _jsonModel.Id;
Expand Down Expand Up @@ -100,6 +104,7 @@ public RestMessage(NetCord.JsonModels.JsonMessage jsonModel, RestClient client)
public int? Position => _jsonModel.Position;
public RoleSubscriptionData? RoleSubscriptionData { get; }
public InteractionResolvedData? ResolvedData { get; }
public MessagePoll? Poll { get; }

public Task<RestMessage> ReplyAsync(ReplyMessageProperties replyMessage, RestRequestProperties? properties = null)
=> SendAsync(replyMessage.ToMessageProperties(Id), properties);
Expand Down