See also: Discord.Addons.Collectors
An extension for Discord.Net that can synchronize messages.
This extension was made primarily to enable the synchronization of multiple messages with the exact same content at once. This allows you to update a single parent message, which will then automatically update all linked children.
The LinkedMessage binds to messages that are not sent by the bot, and are instantly updated whenever that message is updated.
The LinkedUserMessage binds to a message that was only sent from a bot, and can be manually modified at any point in time. Keep in mind that a LinkedUserMessage inherits the LinkedMessage class, which means that all methods that the LinkedMessage class contains can also be executed by a LinkedUserMessage.
LinkedMessage linkedMessage = LinkedMessage.Create(Context.Message, LinkDeleteHandling.Source, Context.Client);The parameters for the LinkedMessage structure requires an IMessage to bind to, a specified LinkDeleteHandling flag, and a BaseSocketClient to initialize this message for. The BaseSocketClient is used to automatically handle updates when the message is changed.
RestUserMessage message = await Context.Channel.SendMessageAsync("This is a test.");
LinkedUserMessage linkedUserMessage = LinkedUserMessage.Create(message, LinkDeleteHandling.Source);The parameters for the LinkedUserMessage requires an IUserMessage to bind to, along with a specified LinkDeleteHandling flag. Although a BaseSocketClient isn't required to initialize a new LinkedUserMessage, it will not be able to automatically handle source deletion outside of the program. An example of this is when a user manually deletes the message from Discord.
await linkedUserMessage.ModifyAsync(x => x.Content = "This is an updated message.");This method is identical to the existing ModifyAsync methods that exist on Discord message classes. Using this will update all subscribed children from this method.
IUserMessage child = await linkedMessage.CloneAsync(Context.Channel);This method initializes a new message to the specified IChannel that will automatically update whenever the parent message is updated. Likewise with other Discord methods, there is an optional parameter for RequestOptions. This method can be called multiple times in the same channel, but it will simply just initialize new children messages.
RestUserMessage newChild = await Context.Channel.SendMessageAsync("This is a message.");
bool isLinkSuccess = await linkedMessage.AddAsync(newChild);As long as the binding message is an IUserMessage, the message can be linked to a LinkedMessage. This will automatically update the binding message to mimic the parent message as well, only if the method was successful.
bool isSuccess = linkedMessage.Remove(messageId);When this method is called, it will attempt to remove and unlink the specified message ID (ulong) from the collection of children. If it was successful, it will return a Boolean value as true. Otherwise, it will return false.
await linkedMessage.DeleteAsync();This method will delete a LinkedMessage. The way a LinkedMessage is deleted is entirely based on the LinkDeleteHandling flag you set. If the specified flag is LinkDeleteHandling.All, every message that the LinkedMessage handles is deleted. This includes all children alongside the parent. Likewise, if the specified flag is LinkDeleteHandling.Source, all children within a LinkedMessage will be updated to display [Original Message Deleted], while the source of the LinkedMessage is deleted.
Discord.Net for the original logo design.