--- uid: FAQ.Basics.BasicOp title: Basic Operations Questions --- # Basic Operations Questions In the following section, you will find commonly asked questions and answers regarding basic usage of the library, as well as language-specific tips when using this library. ## How should I safely check a type? > [!WARNING] > Direct casting (e.g., `(Type)type`) is **the least recommended** > way of casting, as it _can_ throw an [InvalidCastException] > when the object isn't the desired type. > > Please refer to [this post] for more details. In Discord.Net, the idea of polymorphism is used throughout. You may need to cast the object as a certain type before you can perform any action. A good and safe casting example: [!code-csharp[Casting](samples/cast.cs)] [invalidcastexception]: https://docs.microsoft.com/en-us/dotnet/api/system.invalidcastexception [this post]: https://docs.microsoft.com/en-us/dotnet/csharp/how-to/safely-cast-using-pattern-matching-is-and-as-operators ## How do I send a message? > [!TIP] > The [GetChannel] method by default returns an [IChannel], allowing > channel types such as [IVoiceChannel], [ICategoryChannel] > to be returned; consequently, you cannot send a message > to channels like those. Any implementation of [IMessageChannel] has a [SendMessageAsync] method. You can get the channel via [GetChannel] under the client. Remember, when using Discord.Net, polymorphism is a common recurring theme. This means an object may take in many shapes or form, which means casting is your friend. You should attempt to cast the channel as an [IMessageChannel] or any other entity that implements it to be able to message. [sendmessageasync]: xref:Discord.IMessageChannel.SendMessageAsync* [getchannel]: xref:Discord.WebSocket.DiscordSocketClient.GetChannel* ## How can I tell if a message is from X, Y, Z channel? You may check the message channel type. Visit [Glossary] to see the various types of channels. [Glossary]: xref:Guides.Entities.Glossary#channels ## How can I get the guild from a message? There are 2 ways to do this. You can do either of the following, 1. Cast the user as an [IGuildUser] and use its [IGuild] property. 2. Cast the channel as an [IGuildChannel] and use its [IGuild] property. ## How do I add hyperlink text to an embed? Embeds can use standard [markdown] in the description field as well as in field values. With that in mind, links can be added with `[text](link)`. [markdown]: https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline- ## How do I add reactions to a message? Any entity that implements [IUserMessage] has an [AddReactionAsync] method. This method expects an [IEmote] as a parameter. In Discord.Net, an Emote represents a custom-image emote, while an Emoji is a Unicode emoji (standard emoji). Both [Emoji] and [Emote] implement [IEmote] and are valid options. # [Adding a reaction to another message](#tab/emoji-others) [!code-csharp[Emoji](samples/emoji-others.cs)] # [Adding a reaction to a sent message](#tab/emoji-self) [!code-csharp[Emoji](samples/emoji-self.cs)] --- [addreactionasync]: xref:Discord.IMessage.AddReactionAsync* ## What is a "preemptive rate limit?" A preemptive rate limit is Discord.Net's way of telling you to slow down before you get hit by the real rate limit. Hitting a real rate limit might prevent your entire client from sending any requests for a period of time. This is calculated based on the HTTP header returned by a Discord response. ## Why am I getting so many preemptive rate limits when I try to add more than one reactions? This is due to how HTML header works, mistreating 0.25sec/action to 1sec. This causes the lib to throw preemptive rate limit more frequently than it should for methods such as adding reactions. ## Can I opt-out of preemptive rate limits? Unfortunately, not at the moment. See [#401](https://github.com/discord-net/Discord.Net/issues/401). [IChannel]: xref:Discord.IChannel [ICategoryChannel]: xref:Discord.ICategoryChannel [IGuildChannel]: xref:Discord.IGuildChannel [ITextChannel]: xref:Discord.ITextChannel [IGuild]: xref:Discord.IGuild [IVoiceChannel]: xref:Discord.IVoiceChannel [IGuildUser]: xref:Discord.IGuildUser [IMessageChannel]: xref:Discord.IMessageChannel [IUserMessage]: xref:Discord.IUserMessage [IEmote]: xref:Discord.IEmote [Emote]: xref:Discord.Emote [Emoji]: xref:Discord.Emoji