@@ -1,23 +0,0 @@ | |||||
Modes | |||||
====== | |||||
Usage | |||||
----- | |||||
Using this library requires you to state the intention of the program using it. | |||||
By default, the library assumes your application is a bot or otherwise automated program, and locks access to certain client-only features. | |||||
As we approach the official API, Discord will be creating a divide between bots and clients, so it's important to use the mode appropriate for your program to minimize breaking changes! | |||||
.. warning:: | |||||
This is not a complete list, new features will be added in the future. | |||||
Client-Only Features | |||||
-------------------- | |||||
- Message Acknowledgement (Message.Acknowledge(), DiscordClient.MessageAcknowledged) | |||||
- Message Importing/Exporting | |||||
- Message Read States | |||||
Bot-Only Features | |||||
----------------- | |||||
- Currently, None |
@@ -28,7 +28,6 @@ This Documentation is **currently undergoing a rewrite**. Some pages (marked wit | |||||
:maxdepth: 2 | :maxdepth: 2 | ||||
getting_started | getting_started | ||||
features/modes | |||||
features/logging | features/logging | ||||
features/management | features/management | ||||
features/permissions | features/permissions | ||||
@@ -295,10 +295,10 @@ namespace Discord.Net.WebSockets | |||||
int rtpPacketLength = 0; | int rtpPacketLength = 0; | ||||
voicePacket[0] = 0x80; //Flags; | voicePacket[0] = 0x80; //Flags; | ||||
voicePacket[1] = 0x78; //Payload Type | voicePacket[1] = 0x78; //Payload Type | ||||
voicePacket[8] = (byte)((_ssrc >> 24) & 0xFF); | |||||
voicePacket[9] = (byte)((_ssrc >> 16) & 0xFF); | |||||
voicePacket[10] = (byte)((_ssrc >> 8) & 0xFF); | |||||
voicePacket[11] = (byte)((_ssrc >> 0) & 0xFF); | |||||
voicePacket[8] = (byte)(_ssrc >> 24); | |||||
voicePacket[9] = (byte)(_ssrc >> 16); | |||||
voicePacket[10] = (byte)(_ssrc >> 8); | |||||
voicePacket[11] = (byte)(_ssrc >> 0); | |||||
if (_isEncrypted) | if (_isEncrypted) | ||||
Buffer.BlockCopy(voicePacket, 0, nonce, 0, 12); | Buffer.BlockCopy(voicePacket, 0, nonce, 0, 12); | ||||
@@ -309,12 +309,12 @@ namespace Discord.Net.WebSockets | |||||
if (!hasFrame && _sendBuffer.Pop(frame)) | if (!hasFrame && _sendBuffer.Pop(frame)) | ||||
{ | { | ||||
ushort sequence = unchecked(_sequence++); | ushort sequence = unchecked(_sequence++); | ||||
voicePacket[2] = (byte)((sequence >> 8) & 0xFF); | |||||
voicePacket[3] = (byte)((sequence >> 0) & 0xFF); | |||||
voicePacket[4] = (byte)((timestamp >> 24) & 0xFF); | |||||
voicePacket[5] = (byte)((timestamp >> 16) & 0xFF); | |||||
voicePacket[6] = (byte)((timestamp >> 8) & 0xFF); | |||||
voicePacket[7] = (byte)((timestamp >> 0) & 0xFF); | |||||
voicePacket[2] = (byte)(sequence >> 8); | |||||
voicePacket[3] = (byte)(sequence >> 0); | |||||
voicePacket[4] = (byte)(timestamp >> 24); | |||||
voicePacket[5] = (byte)(timestamp >> 16); | |||||
voicePacket[6] = (byte)(timestamp >> 8); | |||||
voicePacket[7] = (byte)(timestamp >> 0); | |||||
//Encode | //Encode | ||||
int encodedLength = _encoder.EncodeFrame(frame, 0, encodedFrame); | int encodedLength = _encoder.EncodeFrame(frame, 0, encodedFrame); | ||||
@@ -878,24 +878,6 @@ namespace Discord | |||||
Logger.Warning("MESSAGE_DELETE referenced an unknown channel."); | Logger.Warning("MESSAGE_DELETE referenced an unknown channel."); | ||||
} | } | ||||
break; | break; | ||||
case "MESSAGE_ACK": | |||||
{ | |||||
if (Config.Mode == DiscordMode.Client) | |||||
{ | |||||
var data = e.Payload.ToObject<MessageAckEvent>(Serializer); | |||||
var channel = GetChannel(data.ChannelId); | |||||
if (channel != null) | |||||
{ | |||||
var msg = channel.GetMessage(data.MessageId, null); | |||||
if (Config.LogEvents) | |||||
Logger.Verbose($"Message Ack: {channel.Server?.Name ?? "[Private]"}/{channel.Name}"); | |||||
OnMessageAcknowledged(msg); | |||||
} | |||||
else | |||||
Logger.Warning("MESSAGE_ACK referenced an unknown channel."); | |||||
} | |||||
} | |||||
break; | |||||
//Statuses | //Statuses | ||||
case "PRESENCE_UPDATE": | case "PRESENCE_UPDATE": | ||||
@@ -1014,6 +996,7 @@ namespace Discord | |||||
case "GUILD_INTEGRATIONS_UPDATE": | case "GUILD_INTEGRATIONS_UPDATE": | ||||
case "VOICE_SERVER_UPDATE": | case "VOICE_SERVER_UPDATE": | ||||
case "GUILD_EMOJIS_UPDATE": | case "GUILD_EMOJIS_UPDATE": | ||||
case "MESSAGE_ACK": | |||||
break; | break; | ||||
//Others | //Others | ||||
@@ -5,13 +5,6 @@ using System.Text; | |||||
namespace Discord | namespace Discord | ||||
{ | { | ||||
public enum DiscordMode | |||||
{ | |||||
/// <summary> Enable bot-only functions. Use this mode if you are creating a bot, automated application, or interface. </summary> | |||||
Bot = 0, | |||||
/// <summary> Enables client-only functions. Use this mode if you are creating a custom client. </summary> | |||||
Client | |||||
} | |||||
public enum LogSeverity : byte | public enum LogSeverity : byte | ||||
{ | { | ||||
Error = 1, | Error = 1, | ||||
@@ -52,9 +45,6 @@ namespace Discord | |||||
/// <summary> Enables or disables the default event logger. </summary> | /// <summary> Enables or disables the default event logger. </summary> | ||||
public bool LogEvents { get { return _logEvents; } set { SetValue(ref _logEvents, value); } } | public bool LogEvents { get { return _logEvents; } set { SetValue(ref _logEvents, value); } } | ||||
private bool _logEvents = true; | private bool _logEvents = true; | ||||
/// <summary> Specifies the mode that this application should run in. </summary> | |||||
public DiscordMode Mode { get { return _mode; } set { SetValue(ref _mode, value); } } | |||||
private DiscordMode _mode = DiscordMode.Bot; | |||||
/// <summary> User Agent string to use when connecting to Discord. </summary> | /// <summary> User Agent string to use when connecting to Discord. </summary> | ||||
public string UserAgent { get; private set; } | public string UserAgent { get; private set; } | ||||
@@ -11,12 +11,10 @@ namespace Discord.Legacy | |||||
[Obsolete("Use User.Mention instead")] | [Obsolete("Use User.Mention instead")] | ||||
public static string User(User user) | public static string User(User user) | ||||
=> user.Mention; | => user.Mention; | ||||
/// <summary> Returns the string used to create a channel mention. </summary> | /// <summary> Returns the string used to create a channel mention. </summary> | ||||
[Obsolete("Use Channel.Mention instead")] | [Obsolete("Use Channel.Mention instead")] | ||||
public static string Channel(Channel channel) | public static string Channel(Channel channel) | ||||
=> channel.Mention; | => channel.Mention; | ||||
/// <summary> Returns the string used to create a mention to everyone in a channel. </summary> | /// <summary> Returns the string used to create a mention to everyone in a channel. </summary> | ||||
[Obsolete("Use Server.EveryoneRole.Mention instead")] | [Obsolete("Use Server.EveryoneRole.Mention instead")] | ||||
public static string Everyone() | public static string Everyone() | ||||
@@ -180,50 +178,6 @@ namespace Discord.Legacy | |||||
return channel.DownloadMessages(limit, relativeMessageId, relativeDir, useCache); | return channel.DownloadMessages(limit, relativeMessageId, relativeDir, useCache); | ||||
} | } | ||||
[Obsolete("Use Message.Acknowledge")] | |||||
public static Task AckMessage(this DiscordClient client, Message message) | |||||
{ | |||||
if (message == null) throw new ArgumentNullException(nameof(message)); | |||||
return message.Acknowledge(); | |||||
} | |||||
/*[Obsolete("Use Channel.ImportMessages")] | |||||
public IEnumerable<Message> ImportMessages(Channel channel, string json) | |||||
{ | |||||
if (json == null) throw new ArgumentNullException(nameof(json)); | |||||
var dic = JArray.Parse(json) | |||||
.Select(x => | |||||
{ | |||||
var msg = new Message(this, | |||||
x["Id"].Value<ulong>(), | |||||
channel.Id, | |||||
x["UserId"].Value<ulong>()); | |||||
var reader = x.CreateReader(); | |||||
_messageImporter.Populate(reader, msg); | |||||
msg.Text = Mention.Resolve(msg, msg.RawText); | |||||
return msg; | |||||
}) | |||||
.ToDictionary(x => x.Id); | |||||
_messages.Import(dic); | |||||
foreach (var msg in dic.Values) | |||||
{ | |||||
var user = msg.User; | |||||
if (user != null) | |||||
user.UpdateActivity(msg.EditedTimestamp ?? msg.Timestamp); | |||||
} | |||||
return dic.Values; | |||||
} | |||||
[Obsolete("Use Channel.ExportMessages")] | |||||
public string ExportMessages(Channel channel) | |||||
{ | |||||
if (channel == null) throw new ArgumentNullException(nameof(channel)); | |||||
return JsonConvert.SerializeObject(channel.Messages); | |||||
}*/ | |||||
[Obsolete("Use Server.GetUser")] | [Obsolete("Use Server.GetUser")] | ||||
public static User GetUser(this DiscordClient client, Server server, ulong userId) | public static User GetUser(this DiscordClient client, Server server, ulong userId) | ||||
{ | { | ||||
@@ -405,5 +359,21 @@ namespace Discord.Legacy | |||||
if (channel == null) throw new ArgumentNullException(nameof(channel)); | if (channel == null) throw new ArgumentNullException(nameof(channel)); | ||||
return channel.RemovePermissionsRule(role); | return channel.RemovePermissionsRule(role); | ||||
} | } | ||||
[Obsolete("Removed", true)] | |||||
public static Task AckMessage(this DiscordClient client, Message message) | |||||
{ | |||||
throw new InvalidOperationException(); | |||||
} | |||||
[Obsolete("Use Channel.ImportMessages", true)] | |||||
public static IEnumerable<Message> ImportMessages(Channel channel, string json) | |||||
{ | |||||
throw new InvalidOperationException(); | |||||
} | |||||
[Obsolete("Use Channel.ExportMessages", true)] | |||||
public static string ExportMessages(Channel channel) | |||||
{ | |||||
throw new InvalidOperationException(); | |||||
} | |||||
} | } | ||||
} | } |
@@ -341,17 +341,6 @@ namespace Discord | |||||
catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | catch (HttpException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { } | ||||
} | } | ||||
} | } | ||||
public Task Acknowledge() | |||||
{ | |||||
if (Client.Config.Mode != DiscordMode.Client) | |||||
throw new InvalidOperationException("This function may only be used in Client mode."); | |||||
if (User.Id != Client.CurrentUser.Id) | |||||
return Client.ClientAPI.Send(new AckMessageRequest(Channel.Id, Id)); | |||||
else | |||||
return TaskHelper.CompletedTask; | |||||
} | |||||
/// <summary> Returns true if the logged-in user was mentioned. </summary> | /// <summary> Returns true if the logged-in user was mentioned. </summary> | ||||
public bool IsMentioningMe(bool includeRoles = false) | public bool IsMentioningMe(bool includeRoles = false) | ||||