From 031a79aa7e0e5e6e6dd56f149bdb86a71ba9a332 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Thu, 13 Aug 2015 15:05:57 -0300 Subject: [PATCH] Added search commands and avatarurl --- Discord.Net/API/Endpoints.cs | 3 +- Discord.Net/DiscordClient.cs | 82 +++++++++++++++++++++++++++++------- Discord.Net/Helpers/Http.cs | 9 ++-- Discord.Net/User.cs | 6 ++- 4 files changed, 76 insertions(+), 24 deletions(-) diff --git a/Discord.Net/API/Endpoints.cs b/Discord.Net/API/Endpoints.cs index 022eed5d0..554fb1913 100644 --- a/Discord.Net/API/Endpoints.cs +++ b/Discord.Net/API/Endpoints.cs @@ -38,7 +38,8 @@ // /api/users public static readonly string Users = $"{BaseApi}/users"; - public static string UserChannels(string id) => $"{Users}/{id}/channels"; + public static string UserChannels(string userId) => $"{Users}/{userId}/channels"; + public static string UserAvatar(string userId, string avatarId) => $"{Users}/{userId}/avatars/{avatarId}.jpg"; // /api/voice public static readonly string Voice = $"{BaseApi}/voice"; diff --git a/Discord.Net/DiscordClient.cs b/Discord.Net/DiscordClient.cs index 2ae330499..676810672 100644 --- a/Discord.Net/DiscordClient.cs +++ b/Discord.Net/DiscordClient.cs @@ -25,30 +25,25 @@ namespace Discord public IEnumerable Users { get { return _users; } } private AsyncCache _users; - public User GetUser(string id) => _users[id]; public IEnumerable Servers { get { return _servers; } } private AsyncCache _servers; - public Server GetServer(string id) => _servers[id]; public IEnumerable Channels { get { return _channels; } } private AsyncCache _channels; - public Channel GetChannel(string id) => _channels[id]; public IEnumerable Messages { get { return _messages; } } private AsyncCache _messages; - public Message GetMessage(string id) => _messages[id]; public IEnumerable Roles { get { return _roles; } } private AsyncCache _roles; - public Role GetRole(string id) => _roles[id]; public bool IsConnected { get { return _isReady; } } public DiscordClient() { string version = typeof(DiscordClient).GetTypeInfo().Assembly.GetName().Version.ToString(2); - _httpOptions = new HttpOptions { UserAgent = $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)" }; + _httpOptions = new HttpOptions($"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"); _servers = new AsyncCache( (key, parentKey) => new Server(key, this), @@ -60,7 +55,7 @@ namespace Discord var defaultChannel = new ChannelReference() { Id = server.DefaultChannelId, GuildId = server.Id }; _channels.Update(defaultChannel.Id, defaultChannel.GuildId, defaultChannel); } - if (model is ExtendedServerInfo) + if (model is ExtendedServerInfo) { var extendedModel = model as ExtendedServerInfo; server.AFKChannelId = extendedModel.AFKChannelId; @@ -81,7 +76,7 @@ namespace Discord try { var messages = DiscordAPI.GetMessages(channel.Id, _httpOptions).Result.OrderBy(x => x.Timestamp); - foreach (var message in messages) + foreach (var message in messages) { var msg = _messages.Update(message.Id, message.ChannelId, message); if (msg.User != null) @@ -122,14 +117,14 @@ namespace Discord if (model is API.Models.Message) { var extendedModel = model as API.Models.Message; - message.Attachments = extendedModel.Attachments; + message.Attachments = extendedModel.Attachments; message.Text = extendedModel.Content; message.Embeds = extendedModel.Embeds; message.IsMentioningEveryone = extendedModel.IsMentioningEveryone; message.IsTTS = extendedModel.IsTextToSpeech; message.UserId = extendedModel.Author.Id; message.Timestamp = extendedModel.Timestamp; - } + } if (model is WebSocketEvents.MessageUpdate) { var extendedModel = model as WebSocketEvents.MessageUpdate; @@ -140,7 +135,7 @@ namespace Discord ); _roles = new AsyncCache( (key, parentKey) => new Role(key, parentKey, this), - (role, model) => + (role, model) => { role.Permissions = model.Permissions; }, @@ -150,7 +145,7 @@ namespace Discord (key, parentKey) => new User(key, this), (user, model) => { - user.Avatar = model.Avatar; + user.AvatarId = model.Avatar; user.Discriminator = model.Discriminator; user.Name = model.Username; if (model is SelfUserInfo) @@ -170,8 +165,8 @@ namespace Discord ); _webSocket = new DiscordWebSocket(); - _webSocket.Connected += (s,e) => RaiseConnected(); - _webSocket.Disconnected += async (s,e) => + _webSocket.Connected += (s, e) => RaiseConnected(); + _webSocket.Disconnected += async (s, e) => { //Reconnect if we didn't cause the disconnect RaiseDisconnected(); @@ -282,7 +277,7 @@ namespace Discord { var data = e.Event.ToObject(); var user = _users.Update(data.User.Id, data.User); - var server = _servers[data.GuildId]; + var server = _servers[data.GuildId]; if (server != null && server.RemoveMember(user.Id)) RaiseMemberRemoved(user, server); } @@ -405,6 +400,62 @@ namespace Discord _webSocket.OnDebugMessage += (s, e) => RaiseOnDebugMessage(e.Message); } + //Collections + public User GetUser(string id) => _users[id]; + public User FindUser(string name) + { + return _users + .Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase)) + .FirstOrDefault(); + } + public User FindUser(string name, string discriminator) + { + return _users + .Where(x => + string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase) && + x.Discriminator == discriminator + ) + .FirstOrDefault(); + } + public User FindChannelUser(Channel channel, string name) + => FindChannelUser(channel, name); + public User FindChannelUser(string channelId, string name) + { + return _users + .Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase)) + .FirstOrDefault(); + } + + public Server GetServer(string id) => _servers[id]; + public Server FindServer(string name) + { + return _servers + .Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase)) + .FirstOrDefault(); + } + + public Channel GetChannel(string id) => _channels[id]; + public Channel FindChannel(string name) + { + return _channels + .Where(x => string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase)) + .FirstOrDefault(); + } + public Channel FindChannel(Server server, string name) + => FindChannel(server.Id, name); + public Channel FindChannel(string serverId, string name) + { + return _channels + .Where(x => + string.Equals(x.Name, name, StringComparison.InvariantCultureIgnoreCase) && + x.ServerId == serverId + ) + .FirstOrDefault(); + } + + public Message GetMessage(string id) => _messages[id]; + public Role GetRole(string id) => _roles[id]; + //Auth public async Task Connect(string email, string password) { @@ -514,7 +565,6 @@ namespace Discord catch (WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound) { } } - //Invites public Task CreateInvite(Server server, int maxAge, int maxUses, bool isTemporary, bool hasXkcdPass) { diff --git a/Discord.Net/Helpers/Http.cs b/Discord.Net/Helpers/Http.cs index 371040e9c..af24fb432 100644 --- a/Discord.Net/Helpers/Http.cs +++ b/Discord.Net/Helpers/Http.cs @@ -11,12 +11,13 @@ namespace Discord.Helpers { internal class HttpOptions { - public string UserAgent, Token; + public readonly string UserAgent; + public string Token; public CookieContainer Cookies; - public HttpOptions(string userAgent = null) + public HttpOptions(string userAgent) { - UserAgent = userAgent ?? "DiscordAPI"; + UserAgent = userAgent; Cookies = new CookieContainer(1); } } @@ -103,8 +104,6 @@ namespace Discord.Helpers private static async Task SendRequest(string method, string path, string data, HttpOptions options, bool hasResponse) { - options = options ?? new HttpOptions(); - //Create Request HttpWebRequest request = WebRequest.CreateHttp(path); request.Accept = "*/*"; diff --git a/Discord.Net/User.cs b/Discord.Net/User.cs index b38ce01bc..4dc59251d 100644 --- a/Discord.Net/User.cs +++ b/Discord.Net/User.cs @@ -1,4 +1,5 @@ -using System; +using Discord.API; +using System; namespace Discord { @@ -9,7 +10,8 @@ namespace Discord public string Id { get; } public string Name { get; internal set; } - public string Avatar { get; internal set; } + public string AvatarId { get; internal set; } + public string AvatarUrl { get { return Endpoints.UserAvatar(Id, AvatarId); } } public string Discriminator { get; internal set; } public string Email { get; internal set; } public bool IsVerified { get; internal set; } = true;