diff --git a/_discord_provider_8cs_source.html b/_discord_provider_8cs_source.html
index f6f42aaca5..7671cac77c 100644
--- a/_discord_provider_8cs_source.html
+++ b/_discord_provider_8cs_source.html
@@ -669,7 +669,7 @@ $(function() {
662 if (!discordChannelResponse.IsSuccess)
- 665 "Error retrieving discord channel {0}: {1} Inner: {2}",
+ 665 "Error retrieving discord channel {channelId}: {error} Inner: {innerError}",
667 discordChannelResponse.Error.Message,
668 discordChannelResponse.Inner?.Error?.Message);
@@ -680,239 +680,241 @@ $(function() {
673 var channelType = discordChannelResponse.Entity.Type;
674 if (channelType != ChannelType.GuildText && channelType != ChannelType.GuildAnnouncement)
- 676 Logger.LogWarning(
"Cound not map channel {0}! Incorrect type: {1}", channelId, discordChannelResponse.Entity.Type);
+ 676 Logger.LogWarning(
"Cound not map channel {channelId}! Incorrect type: {channelType}", channelId, discordChannelResponse.Entity.Type);
680 friendlyName = discordChannelResponse.Entity.Name.Value;
-
- 682 var guildsClient =
serviceProvider.GetRequiredService<IDiscordRestGuildAPI>();
- 683 var guildsResponse = await guildsClient.GetGuildAsync(
- 684 discordChannelResponse.Entity.GuildID.Value,
-
-
- 687 if (!guildsResponse.IsSuccess)
-
-
- 690 "Error retrieving discord guild {0}: {1}",
- 691 discordChannelResponse.Entity.GuildID.Value,
- 692 discordChannelResponse.Error.Message);
- 693 remapRequired =
true;
-
-
-
- 697 connectionName = guildsResponse.Entity.Name;
-
-
-
-
-
- 703 IsAdminChannel = channelFromDB.IsAdminChannel ==
true,
- 704 ConnectionName = connectionName,
- 705 FriendlyName = friendlyName,
- 706 IsPrivateChannel =
false,
- 707 Tag = channelFromDB.
Tag,
- 708 EmbedsSupported =
true,
-
-
- 711 Logger.LogTrace(
"Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
- 712 return Tuple.Create(channelFromDB, channelModel);
-
-
-
- 716 .Select(x => GetModelChannelFromDBChannel(x))
-
-
- 719 await Task.WhenAll(tasks);
+ 681 var guildId = discordChannelResponse.Entity.GuildID.Value;
+
+ 683 var guildsClient =
serviceProvider.GetRequiredService<IDiscordRestGuildAPI>();
+ 684 var guildsResponse = await guildsClient.GetGuildAsync(
+
+
+
+ 688 if (!guildsResponse.IsSuccess)
+
+
+ 691 "Error retrieving discord guild {guildID}: {error} Inner: {innerError}",
+
+ 693 guildsResponse.Error.Message,
+ 694 guildsResponse.Inner?.Error?.Message);
+ 695 remapRequired =
true;
+
+
+
+ 699 connectionName = guildsResponse.Entity.Name;
+
+
+
+
+
+ 705 IsAdminChannel = channelFromDB.IsAdminChannel ==
true,
+ 706 ConnectionName = connectionName,
+ 707 FriendlyName = friendlyName,
+ 708 IsPrivateChannel =
false,
+ 709 Tag = channelFromDB.
Tag,
+ 710 EmbedsSupported =
true,
+
+
+ 713 Logger.LogTrace(
"Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
+ 714 return Tuple.Create(channelFromDB, channelModel);
+
+
+
+ 718 .Select(x => GetModelChannelFromDBChannel(x))
+
- 721 var enumerator = tasks
- 722 .Select(x => x.Result)
- 723 .Where(x => x !=
null)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 743 #pragma warning disable CA1502
-
-
-
-
-
- 749 List<string> embedErrors =
new List<string>();
- 750 Optional<Color> colour =
default;
-
- 752 if (Int32.TryParse(embed.
Colour.Substring(1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var argb))
- 753 colour = Color.FromArgb(argb);
-
-
-
- 757 CultureInfo.InvariantCulture,
- 758 "Invalid embed colour: {0}",
-
-
-
-
- 763 embedErrors.Add(
"Null or whitespace embed author name!");
-
-
-
- 767 List<IEmbedField> fields =
null;
-
-
- 770 fields =
new List<IEmbedField>();
-
- 772 foreach (var field
in embed.
Fields)
-
-
-
- 776 if (String.IsNullOrWhiteSpace(field.Name))
-
-
-
- 780 CultureInfo.InvariantCulture,
- 781 "Null or whitespace field author at index {0}!",
-
-
-
-
- 786 if (String.IsNullOrWhiteSpace(field.Value))
-
-
-
- 790 CultureInfo.InvariantCulture,
- 791 "Null or whitespace field author at index {0}!",
-
-
-
-
-
-
-
- 799 fields.Add(
new EmbedField(field.Name, field.Value)
-
- 801 IsInline = field.IsInline ?? default(Optional<bool>),
-
-
-
-
-
-
- 808 embedErrors.Add(
"Null or whitespace embed footer text!");
-
-
-
- 812 if (embed.
Image !=
null && String.IsNullOrWhiteSpace(embed.
Image.
Url))
-
- 814 embedErrors.Add(
"Null or whitespace embed image url!");
-
-
-
-
-
- 820 embedErrors.Add(
"Null or whitespace embed thumbnail url!");
- 821 embed.Thumbnail =
null;
-
-
- 824 Optional<DateTimeOffset> timestampOptional =
default;
-
- 826 if (DateTimeOffset.TryParse(embed.
Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp))
- 827 timestampOptional = timestamp.ToUniversalTime();
-
-
-
- 831 CultureInfo.InvariantCulture,
- 832 "Invalid embed timestamp: {0}",
-
-
- 835 var discordEmbed =
new Embed
-
- 837 Author = embed.Author !=
null
-
-
- 840 IconUrl = embed.Author.IconUrl ??
default(Optional<string>),
- 841 ProxyIconUrl = embed.Author.ProxyIconUrl ??
default(Optional<string>),
- 842 Url = embed.Author.Url ??
default(Optional<string>),
-
- 844 :
default(Optional<IEmbedAuthor>),
-
- 846 Description = embed.Description ??
default(Optional<string>),
- 847 Fields = fields ??
default(Optional<IReadOnlyList<IEmbedField>>),
- 848 Footer = embed.Footer !=
null
-
-
- 851 IconUrl = embed.Footer.IconUrl ??
default(Optional<string>),
- 852 ProxyIconUrl = embed.Footer.ProxyIconUrl ??
default(Optional<string>),
-
-
- 855 Image = embed.Image !=
null
-
-
- 858 Width = embed.Image.Width ??
default(Optional<int>),
- 859 Height = embed.Image.Height ??
default(Optional<int>),
- 860 ProxyUrl = embed.Image.ProxyUrl ??
default(Optional<string>),
-
- 862 :
default(Optional<IEmbedImage>),
-
-
-
- 866 Name = embed.Provider.Name ??
default(Optional<string>),
- 867 Url = embed.Provider.Url ??
default(Optional<string>),
-
- 869 :
default(Optional<IEmbedProvider>),
- 870 Thumbnail = embed.Thumbnail !=
null
-
-
- 873 Width = embed.Thumbnail.Width ??
default(Optional<int>),
- 874 Height = embed.Thumbnail.Height ??
default(Optional<int>),
- 875 ProxyUrl = embed.Thumbnail.ProxyUrl ??
default(Optional<string>),
-
- 877 :
default(Optional<IEmbedThumbnail>),
- 878 Timestamp = timestampOptional,
- 879 Title = embed.Title ??
default(Optional<string>),
- 880 Url = embed.Url ??
default(Optional<string>),
- 881 Video = embed.Video !=
null
-
-
- 884 Url = embed.Video.Url ??
default(Optional<string>),
- 885 Width = embed.Video.Width ??
default(Optional<int>),
- 886 Height = embed.Video.Height ??
default(Optional<int>),
- 887 ProxyUrl = embed.Video.ProxyUrl ??
default(Optional<string>),
-
- 889 :
default(Optional<IEmbedVideo>),
-
-
- 892 var result =
new List<IEmbed> { discordEmbed };
+ 721 await Task.WhenAll(tasks);
+
+ 723 var enumerator = tasks
+ 724 .Select(x => x.Result)
+ 725 .Where(x => x !=
null)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 745 #pragma warning disable CA1502
+
+
+
+
+
+ 751 List<string> embedErrors =
new List<string>();
+ 752 Optional<Color> colour =
default;
+
+ 754 if (Int32.TryParse(embed.
Colour.Substring(1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var argb))
+ 755 colour = Color.FromArgb(argb);
+
+
+
+ 759 CultureInfo.InvariantCulture,
+ 760 "Invalid embed colour: {0}",
+
+
+
+
+ 765 embedErrors.Add(
"Null or whitespace embed author name!");
+
+
+
+ 769 List<IEmbedField> fields =
null;
+
+
+ 772 fields =
new List<IEmbedField>();
+
+ 774 foreach (var field
in embed.
Fields)
+
+
+
+ 778 if (String.IsNullOrWhiteSpace(field.Name))
+
+
+
+ 782 CultureInfo.InvariantCulture,
+ 783 "Null or whitespace field author at index {0}!",
+
+
+
+
+ 788 if (String.IsNullOrWhiteSpace(field.Value))
+
+
+
+ 792 CultureInfo.InvariantCulture,
+ 793 "Null or whitespace field author at index {0}!",
+
+
+
+
+
+
+
+ 801 fields.Add(
new EmbedField(field.Name, field.Value)
+
+ 803 IsInline = field.IsInline ?? default(Optional<bool>),
+
+
+
+
+
+
+ 810 embedErrors.Add(
"Null or whitespace embed footer text!");
+
+
+
+ 814 if (embed.
Image !=
null && String.IsNullOrWhiteSpace(embed.
Image.
Url))
+
+ 816 embedErrors.Add(
"Null or whitespace embed image url!");
+
+
+
+
+
+ 822 embedErrors.Add(
"Null or whitespace embed thumbnail url!");
+ 823 embed.Thumbnail =
null;
+
+
+ 826 Optional<DateTimeOffset> timestampOptional =
default;
+
+ 828 if (DateTimeOffset.TryParse(embed.
Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp))
+ 829 timestampOptional = timestamp.ToUniversalTime();
+
+
+
+ 833 CultureInfo.InvariantCulture,
+ 834 "Invalid embed timestamp: {0}",
+
+
+ 837 var discordEmbed =
new Embed
+
+ 839 Author = embed.Author !=
null
+
+
+ 842 IconUrl = embed.Author.IconUrl ??
default(Optional<string>),
+ 843 ProxyIconUrl = embed.Author.ProxyIconUrl ??
default(Optional<string>),
+ 844 Url = embed.Author.Url ??
default(Optional<string>),
+
+ 846 :
default(Optional<IEmbedAuthor>),
+
+ 848 Description = embed.Description ??
default(Optional<string>),
+ 849 Fields = fields ??
default(Optional<IReadOnlyList<IEmbedField>>),
+ 850 Footer = embed.Footer !=
null
+
+
+ 853 IconUrl = embed.Footer.IconUrl ??
default(Optional<string>),
+ 854 ProxyIconUrl = embed.Footer.ProxyIconUrl ??
default(Optional<string>),
+
+
+ 857 Image = embed.Image !=
null
+
+
+ 860 Width = embed.Image.Width ??
default(Optional<int>),
+ 861 Height = embed.Image.Height ??
default(Optional<int>),
+ 862 ProxyUrl = embed.Image.ProxyUrl ??
default(Optional<string>),
+
+ 864 :
default(Optional<IEmbedImage>),
+
+
+
+ 868 Name = embed.Provider.Name ??
default(Optional<string>),
+ 869 Url = embed.Provider.Url ??
default(Optional<string>),
+
+ 871 :
default(Optional<IEmbedProvider>),
+ 872 Thumbnail = embed.Thumbnail !=
null
+
+
+ 875 Width = embed.Thumbnail.Width ??
default(Optional<int>),
+ 876 Height = embed.Thumbnail.Height ??
default(Optional<int>),
+ 877 ProxyUrl = embed.Thumbnail.ProxyUrl ??
default(Optional<string>),
+
+ 879 :
default(Optional<IEmbedThumbnail>),
+ 880 Timestamp = timestampOptional,
+ 881 Title = embed.Title ??
default(Optional<string>),
+ 882 Url = embed.Url ??
default(Optional<string>),
+ 883 Video = embed.Video !=
null
+
+
+ 886 Url = embed.Video.Url ??
default(Optional<string>),
+ 887 Width = embed.Video.Width ??
default(Optional<int>),
+ 888 Height = embed.Video.Height ??
default(Optional<int>),
+ 889 ProxyUrl = embed.Video.ProxyUrl ??
default(Optional<string>),
+
+ 891 :
default(Optional<IEmbedVideo>),
+
- 894 if (embedErrors.Count > 0)
-
- 896 var joinedErrors = String.Join(Environment.NewLine, embedErrors);
- 897 Logger.LogError(
"Embed description contains errors:{newLine}{issues}", Environment.NewLine, joinedErrors);
-
-
- 900 Title =
"TGS Embed Errors",
- 901 Description = joinedErrors,
-
- 903 Footer =
new EmbedFooter(
"Please report this to your codebase's maintainers."),
- 904 Timestamp = DateTimeOffset.UtcNow,
-
-
-
-
-
- 910 #pragma warning restore CA1502
-
- 912#pragma warning restore CA1506
-
+ 894 var result =
new List<IEmbed> { discordEmbed };
+
+ 896 if (embedErrors.Count > 0)
+
+ 898 var joinedErrors = String.Join(Environment.NewLine, embedErrors);
+ 899 Logger.LogError(
"Embed description contains errors:{newLine}{issues}", Environment.NewLine, joinedErrors);
+
+
+ 902 Title =
"TGS Embed Errors",
+ 903 Description = joinedErrors,
+
+ 905 Footer =
new EmbedFooter(
"Please report this to your codebase's maintainers."),
+ 906 Timestamp = DateTimeOffset.UtcNow,
+
+
+
+
+
+ 912 #pragma warning restore CA1502
+
+ 914#pragma warning restore CA1506
+
ChatConnectionStringBuilder for ChatProvider.Discord.
string? ConnectionString
The information used to connect to the Provider.
Represents a Providers.IProvider channel.
@@ -943,7 +945,7 @@ $(function() {
override async Task< Func< string, string, Task > > SendUpdateMessage(Models.RevisionInformation revisionInformation, Version byondVersion, DateTimeOffset? estimatedCompletionTime, string gitHubOwner, string gitHubRepo, ulong channelId, bool localCommitPushed, CancellationToken cancellationToken)
override async ValueTask DisposeAsync()
override bool Connected
If the IProvider is currently connected.
-Optional< IReadOnlyList< IEmbed > > ConvertEmbed(ChatEmbed embed)
Convert a ChatEmbed to an IEmbed parameters.
+Optional< IReadOnlyList< IEmbed > > ConvertEmbed(ChatEmbed embed)
Convert a ChatEmbed to an IEmbed parameters.
TaskCompletionSource< object > gatewayReadyTcs
The TaskCompletionSource<TResult> for the initial gateway connection event.
Task< Result > RespondAsync(IReady readyEvent, CancellationToken cancellationToken)
override async Task DisconnectImpl(CancellationToken cancellationToken)
Gracefully disconnects the provider. A Task representing the running operation.
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html
index c89976267e..f366b73328 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html
@@ -748,172 +748,172 @@ Here is the call graph for this function:
- Returns
- The parameter for sending a single IEmbed.
-Definition at line 744 of file DiscordProvider.cs.
- 745 {
-
746 if (embed == null)
-
747 return default;
-
748
-
749 List<string> embedErrors = new List<string>();
-
750 Optional<Color> colour = default;
-
-
752 if (Int32.TryParse(embed.
Colour.Substring(1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var argb))
-
753 colour = Color.FromArgb(argb);
-
754 else
-
755 embedErrors.Add(
-
756 String.Format(
-
757 CultureInfo.InvariantCulture,
-
758 "Invalid embed colour: {0}",
-
-
760
-
-
762 {
-
763 embedErrors.Add("Null or whitespace embed author name!");
-
764 embed.Author = null;
-
765 }
-
766
-
767 List<IEmbedField> fields = null;
-
-
769 {
-
770 fields = new List<IEmbedField>();
-
771 var i = -1;
-
772 foreach (var field
in embed.
Fields)
-
773 {
-
774 ++i;
-
775 var invalid = false;
-
776 if (String.IsNullOrWhiteSpace(field.Name))
-
777 {
-
778 embedErrors.Add(
-
779 String.Format(
-
780 CultureInfo.InvariantCulture,
-
781 "Null or whitespace field author at index {0}!",
-
782 i));
-
783 invalid = true;
-
784 }
-
785
-
786 if (String.IsNullOrWhiteSpace(field.Value))
-
787 {
-
788 embedErrors.Add(
-
789 String.Format(
-
790 CultureInfo.InvariantCulture,
-
791 "Null or whitespace field author at index {0}!",
-
792 i));
-
793 invalid = true;
-
794 }
-
795
-
796 if (invalid)
-
797 continue;
-
798
-
799 fields.Add(new EmbedField(field.Name, field.Value)
-
800 {
-
801 IsInline = field.IsInline ?? default(Optional<bool>),
-
802 });
-
803 }
-
804 }
-
805
-
-
807 {
-
808 embedErrors.Add("Null or whitespace embed footer text!");
-
809 embed.Footer = null;
-
810 }
-
811
-
812 if (embed.
Image !=
null && String.IsNullOrWhiteSpace(embed.
Image.
Url))
-
813 {
-
814 embedErrors.Add("Null or whitespace embed image url!");
-
815 embed.Image = null;
-
816 }
-
817
-
-
819 {
-
820 embedErrors.Add("Null or whitespace embed thumbnail url!");
-
821 embed.Thumbnail = null;
-
822 }
-
823
-
824 Optional<DateTimeOffset> timestampOptional = default;
-
-
826 if (DateTimeOffset.TryParse(embed.
Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp))
-
827 timestampOptional = timestamp.ToUniversalTime();
-
828 else
-
829 embedErrors.Add(
-
830 String.Format(
-
831 CultureInfo.InvariantCulture,
-
832 "Invalid embed timestamp: {0}",
-
-
834
-
835 var discordEmbed = new Embed
-
836 {
-
837 Author = embed.Author != null
-
-
839 {
-
840 IconUrl = embed.Author.IconUrl ?? default(Optional<string>),
-
841 ProxyIconUrl = embed.Author.ProxyIconUrl ?? default(Optional<string>),
-
842 Url = embed.Author.Url ?? default(Optional<string>),
-
843 }
-
844 : default(Optional<IEmbedAuthor>),
-
845 Colour = colour,
-
846 Description = embed.Description ?? default(Optional<string>),
-
847 Fields = fields ?? default(Optional<IReadOnlyList<IEmbedField>>),
-
848 Footer = embed.Footer != null
-
-
850 {
-
851 IconUrl = embed.Footer.IconUrl ?? default(Optional<string>),
-
852 ProxyIconUrl = embed.Footer.ProxyIconUrl ?? default(Optional<string>),
-
853 }
-
854 : default,
-
855 Image = embed.Image != null
-
-
857 {
-
858 Width = embed.Image.Width ?? default(Optional<int>),
-
859 Height = embed.Image.Height ?? default(Optional<int>),
-
860 ProxyUrl = embed.Image.ProxyUrl ?? default(Optional<string>),
-
861 }
-
862 : default(Optional<IEmbedImage>),
-
-
864 ? new EmbedProvider
-
865 {
-
866 Name = embed.Provider.Name ?? default(Optional<string>),
-
867 Url = embed.Provider.Url ?? default(Optional<string>),
-
868 }
-
869 : default(Optional<IEmbedProvider>),
-
870 Thumbnail = embed.Thumbnail != null
-
-
872 {
-
873 Width = embed.Thumbnail.Width ?? default(Optional<int>),
-
874 Height = embed.Thumbnail.Height ?? default(Optional<int>),
-
875 ProxyUrl = embed.Thumbnail.ProxyUrl ?? default(Optional<string>),
-
876 }
-
877 : default(Optional<IEmbedThumbnail>),
-
878 Timestamp = timestampOptional,
-
879 Title = embed.Title ?? default(Optional<string>),
-
880 Url = embed.Url ?? default(Optional<string>),
-
881 Video = embed.Video != null
-
882 ? new EmbedVideo
-
883 {
-
884 Url = embed.Video.Url ?? default(Optional<string>),
-
885 Width = embed.Video.Width ?? default(Optional<int>),
-
886 Height = embed.Video.Height ?? default(Optional<int>),
-
887 ProxyUrl = embed.Video.ProxyUrl ?? default(Optional<string>),
-
888 }
-
889 : default(Optional<IEmbedVideo>),
-
890 };
-
891
-
892 var result = new List<IEmbed> { discordEmbed };
+
Definition at line 746 of file DiscordProvider.cs.
+
747 {
+
748 if (embed == null)
+
749 return default;
+
750
+
751 List<string> embedErrors = new List<string>();
+
752 Optional<Color> colour = default;
+
+
754 if (Int32.TryParse(embed.
Colour.Substring(1), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var argb))
+
755 colour = Color.FromArgb(argb);
+
756 else
+
757 embedErrors.Add(
+
758 String.Format(
+
759 CultureInfo.InvariantCulture,
+
760 "Invalid embed colour: {0}",
+
+
762
+
+
764 {
+
765 embedErrors.Add("Null or whitespace embed author name!");
+
766 embed.Author = null;
+
767 }
+
768
+
769 List<IEmbedField> fields = null;
+
+
771 {
+
772 fields = new List<IEmbedField>();
+
773 var i = -1;
+
774 foreach (var field
in embed.
Fields)
+
775 {
+
776 ++i;
+
777 var invalid = false;
+
778 if (String.IsNullOrWhiteSpace(field.Name))
+
779 {
+
780 embedErrors.Add(
+
781 String.Format(
+
782 CultureInfo.InvariantCulture,
+
783 "Null or whitespace field author at index {0}!",
+
784 i));
+
785 invalid = true;
+
786 }
+
787
+
788 if (String.IsNullOrWhiteSpace(field.Value))
+
789 {
+
790 embedErrors.Add(
+
791 String.Format(
+
792 CultureInfo.InvariantCulture,
+
793 "Null or whitespace field author at index {0}!",
+
794 i));
+
795 invalid = true;
+
796 }
+
797
+
798 if (invalid)
+
799 continue;
+
800
+
801 fields.Add(new EmbedField(field.Name, field.Value)
+
802 {
+
803 IsInline = field.IsInline ?? default(Optional<bool>),
+
804 });
+
805 }
+
806 }
+
807
+
+
809 {
+
810 embedErrors.Add("Null or whitespace embed footer text!");
+
811 embed.Footer = null;
+
812 }
+
813
+
814 if (embed.
Image !=
null && String.IsNullOrWhiteSpace(embed.
Image.
Url))
+
815 {
+
816 embedErrors.Add("Null or whitespace embed image url!");
+
817 embed.Image = null;
+
818 }
+
819
+
+
821 {
+
822 embedErrors.Add("Null or whitespace embed thumbnail url!");
+
823 embed.Thumbnail = null;
+
824 }
+
825
+
826 Optional<DateTimeOffset> timestampOptional = default;
+
+
828 if (DateTimeOffset.TryParse(embed.
Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp))
+
829 timestampOptional = timestamp.ToUniversalTime();
+
830 else
+
831 embedErrors.Add(
+
832 String.Format(
+
833 CultureInfo.InvariantCulture,
+
834 "Invalid embed timestamp: {0}",
+
+
836
+
837 var discordEmbed = new Embed
+
838 {
+
839 Author = embed.Author != null
+
+
841 {
+
842 IconUrl = embed.Author.IconUrl ?? default(Optional<string>),
+
843 ProxyIconUrl = embed.Author.ProxyIconUrl ?? default(Optional<string>),
+
844 Url = embed.Author.Url ?? default(Optional<string>),
+
845 }
+
846 : default(Optional<IEmbedAuthor>),
+
847 Colour = colour,
+
848 Description = embed.Description ?? default(Optional<string>),
+
849 Fields = fields ?? default(Optional<IReadOnlyList<IEmbedField>>),
+
850 Footer = embed.Footer != null
+
+
852 {
+
853 IconUrl = embed.Footer.IconUrl ?? default(Optional<string>),
+
854 ProxyIconUrl = embed.Footer.ProxyIconUrl ?? default(Optional<string>),
+
855 }
+
856 : default,
+
857 Image = embed.Image != null
+
+
859 {
+
860 Width = embed.Image.Width ?? default(Optional<int>),
+
861 Height = embed.Image.Height ?? default(Optional<int>),
+
862 ProxyUrl = embed.Image.ProxyUrl ?? default(Optional<string>),
+
863 }
+
864 : default(Optional<IEmbedImage>),
+
+
866 ? new EmbedProvider
+
867 {
+
868 Name = embed.Provider.Name ?? default(Optional<string>),
+
869 Url = embed.Provider.Url ?? default(Optional<string>),
+
870 }
+
871 : default(Optional<IEmbedProvider>),
+
872 Thumbnail = embed.Thumbnail != null
+
+
874 {
+
875 Width = embed.Thumbnail.Width ?? default(Optional<int>),
+
876 Height = embed.Thumbnail.Height ?? default(Optional<int>),
+
877 ProxyUrl = embed.Thumbnail.ProxyUrl ?? default(Optional<string>),
+
878 }
+
879 : default(Optional<IEmbedThumbnail>),
+
880 Timestamp = timestampOptional,
+
881 Title = embed.Title ?? default(Optional<string>),
+
882 Url = embed.Url ?? default(Optional<string>),
+
883 Video = embed.Video != null
+
884 ? new EmbedVideo
+
885 {
+
886 Url = embed.Video.Url ?? default(Optional<string>),
+
887 Width = embed.Video.Width ?? default(Optional<int>),
+
888 Height = embed.Video.Height ?? default(Optional<int>),
+
889 ProxyUrl = embed.Video.ProxyUrl ?? default(Optional<string>),
+
890 }
+
891 : default(Optional<IEmbedVideo>),
+
892 };
893
-
894 if (embedErrors.Count > 0)
-
895 {
-
896 var joinedErrors = String.Join(Environment.NewLine, embedErrors);
-
897 Logger.LogError(
"Embed description contains errors:{newLine}{issues}", Environment.NewLine, joinedErrors);
-
898 result.Add(new Embed
-
899 {
-
900 Title = "TGS Embed Errors",
-
901 Description = joinedErrors,
-
902 Colour = Color.Red,
-
903 Footer = new EmbedFooter("Please report this to your codebase's maintainers."),
-
904 Timestamp = DateTimeOffset.UtcNow,
-
905 });
-
906 }
-
907
-
908 return result;
-
909 }
+
894 var result = new List<IEmbed> { discordEmbed };
+
895
+
896 if (embedErrors.Count > 0)
+
897 {
+
898 var joinedErrors = String.Join(Environment.NewLine, embedErrors);
+
899 Logger.LogError(
"Embed description contains errors:{newLine}{issues}", Environment.NewLine, joinedErrors);
+
900 result.Add(new Embed
+
901 {
+
902 Title = "TGS Embed Errors",
+
903 Description = joinedErrors,
+
904 Colour = Color.Red,
+
905 Footer = new EmbedFooter("Please report this to your codebase's maintainers."),
+
906 Timestamp = DateTimeOffset.UtcNow,
+
907 });
+
908 }
+
909
+
910 return result;
+
911 }
Provider(IJobManager jobManager, ILogger< Provider > logger, ChatBot chatBot)
Initializes a new instance of the Provider class.
ChatEmbedMedia Image
The ChatEmbedMedia for an image.
@@ -1129,7 +1129,7 @@ Here is the caller graph for this function:
662 if (!discordChannelResponse.IsSuccess)
663 {
-
665 "Error retrieving discord channel {0}: {1} Inner: {2}",
+
665 "Error retrieving discord channel {channelId}: {error} Inner: {innerError}",
666 channelId,
667 discordChannelResponse.Error.Message,
668 discordChannelResponse.Inner?.Error?.Message);
@@ -1140,67 +1140,69 @@ Here is the caller graph for this function:
673 var channelType = discordChannelResponse.Entity.Type;
674 if (channelType != ChannelType.GuildText && channelType != ChannelType.GuildAnnouncement)
675 {
- 676 Logger.LogWarning(
"Cound not map channel {0}! Incorrect type: {1}", channelId, discordChannelResponse.Entity.Type);
+ 676 Logger.LogWarning(
"Cound not map channel {channelId}! Incorrect type: {channelType}", channelId, discordChannelResponse.Entity.Type);
677 return null;
678 }
679
680 friendlyName = discordChannelResponse.Entity.Name.Value;
- 681
- 682 var guildsClient =
serviceProvider.GetRequiredService<IDiscordRestGuildAPI>();
- 683 var guildsResponse = await guildsClient.GetGuildAsync(
- 684 discordChannelResponse.Entity.GuildID.Value,
- 685 false,
- 686 cancellationToken);
- 687 if (!guildsResponse.IsSuccess)
- 688 {
-
- 690 "Error retrieving discord guild {0}: {1}",
- 691 discordChannelResponse.Entity.GuildID.Value,
- 692 discordChannelResponse.Error.Message);
- 693 remapRequired = true;
- 694 return null;
- 695 }
- 696
- 697 connectionName = guildsResponse.Entity.Name;
- 698 }
- 699
- 700 var channelModel = new ChannelRepresentation
- 701 {
- 702 RealId = channelId,
- 703 IsAdminChannel = channelFromDB.IsAdminChannel == true,
- 704 ConnectionName = connectionName,
- 705 FriendlyName = friendlyName,
- 706 IsPrivateChannel = false,
- 707 Tag = channelFromDB.Tag,
- 708 EmbedsSupported = true,
- 709 };
- 710
- 711 Logger.LogTrace(
"Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
- 712 return Tuple.Create(channelFromDB, channelModel);
- 713 }
- 714
- 715 var tasks = channels
- 716 .Select(x => GetModelChannelFromDBChannel(x))
- 717 .ToList();
- 718
- 719 await Task.WhenAll(tasks);
+ 681 var guildId = discordChannelResponse.Entity.GuildID.Value;
+ 682
+ 683 var guildsClient =
serviceProvider.GetRequiredService<IDiscordRestGuildAPI>();
+ 684 var guildsResponse = await guildsClient.GetGuildAsync(
+ 685 guildId,
+ 686 false,
+ 687 cancellationToken);
+ 688 if (!guildsResponse.IsSuccess)
+ 689 {
+
+ 691 "Error retrieving discord guild {guildID}: {error} Inner: {innerError}",
+ 692 guildId,
+ 693 guildsResponse.Error.Message,
+ 694 guildsResponse.Inner?.Error?.Message);
+ 695 remapRequired = true;
+ 696 return null;
+ 697 }
+ 698
+ 699 connectionName = guildsResponse.Entity.Name;
+ 700 }
+ 701
+ 702 var channelModel = new ChannelRepresentation
+ 703 {
+ 704 RealId = channelId,
+ 705 IsAdminChannel = channelFromDB.IsAdminChannel == true,
+ 706 ConnectionName = connectionName,
+ 707 FriendlyName = friendlyName,
+ 708 IsPrivateChannel = false,
+ 709 Tag = channelFromDB.Tag,
+ 710 EmbedsSupported = true,
+ 711 };
+ 712
+ 713 Logger.LogTrace(
"Mapped channel {0}: {1}", channelModel.RealId, channelModel.FriendlyName);
+ 714 return Tuple.Create(channelFromDB, channelModel);
+ 715 }
+ 716
+ 717 var tasks = channels
+ 718 .Select(x => GetModelChannelFromDBChannel(x))
+ 719 .ToList();
720
- 721 var enumerator = tasks
- 722 .Select(x => x.Result)
- 723 .Where(x => x != null)
- 724 .ToList();
- 725
-
- 727 {
-
-
- 730 }
- 731
- 732 if (remapRequired)
-
- 734
- 735 return enumerator;
- 736 }
+ 721 await Task.WhenAll(tasks);
+ 722
+ 723 var enumerator = tasks
+ 724 .Select(x => x.Result)
+ 725 .Where(x => x != null)
+ 726 .ToList();
+ 727
+
+ 729 {
+
+
+ 732 }
+ 733
+ 734 if (remapRequired)
+
+ 736
+ 737 return enumerator;
+ 738 }
void EnqueueMessage(Message message)
Queues a message for NextMessage(CancellationToken).
References Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.initialUserName, Tgstation.Server.Host.Components.Chat.Providers.Provider.Logger, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.serviceProvider, and Tgstation.Server.Host.Components.Chat.ChannelRepresentation.Tag.
@@ -1603,11 +1605,11 @@ Here is the call graph for this function:
300 Logger.LogWarning(e,
"Error sending discord message!");
301 }
302 }
-Optional< IReadOnlyList< IEmbed > > ConvertEmbed(ChatEmbed embed)
Convert a ChatEmbed to an IEmbed parameters.
+Optional< IReadOnlyList< IEmbed > > ConvertEmbed(ChatEmbed embed)
Convert a ChatEmbed to an IEmbed parameters.
ChatEmbed Embed
The ChatEmbed.
string Text
The message string.
-References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed(), Tgstation.Server.Host.Components.Interop.MessageContent.Embed, Tgstation.Server.Host.Components.Chat.Providers.Provider.Logger, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.serviceProvider, and Tgstation.Server.Host.Components.Interop.MessageContent.Text.
+References Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed(), Tgstation.Server.Host.Components.Interop.MessageContent.Embed, Tgstation.Server.Host.Components.Chat.Providers.Provider.Logger, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.mappedChannels, Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.serviceProvider, and Tgstation.Server.Host.Components.Interop.MessageContent.Text.
Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.RespondAsync().
Definition at line 30 of file Provider.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connect(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed(), Tgstation.Server.Host.Components.Chat.Providers.Provider.Disconnect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DisconnectImpl(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.DisconnectImpl(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DisposeAsync(), Tgstation.Server.Host.Components.Chat.Providers.Provider.DisposeAsync(), Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.HardDisconnect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannelsImpl(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.NonBlockingListen(), Tgstation.Server.Host.Components.Chat.Providers.Provider.Provider(), Tgstation.Server.Host.Components.Chat.Providers.Provider.ReconnectionLoop(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.RespondAsync(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SaslAuthenticate(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SendMessage(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendUpdateMessage(), and Tgstation.Server.Host.Components.Chat.Providers.Provider.StopReconnectionTimer().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.Connect(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.Connect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed(), Tgstation.Server.Host.Components.Chat.Providers.Provider.Disconnect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DisconnectImpl(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.DisconnectImpl(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DisposeAsync(), Tgstation.Server.Host.Components.Chat.Providers.Provider.DisposeAsync(), Tgstation.Server.Host.Components.Chat.Providers.Provider.EnqueueMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.HardDisconnect(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.MapChannelsImpl(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.NonBlockingListen(), Tgstation.Server.Host.Components.Chat.Providers.Provider.Provider(), Tgstation.Server.Host.Components.Chat.Providers.Provider.ReconnectionLoop(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.RespondAsync(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SaslAuthenticate(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage(), Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.SendMessage(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendUpdateMessage(), and Tgstation.Server.Host.Components.Chat.Providers.Provider.StopReconnectionTimer().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed.html
index 450b3b19bd..196a81fd8f 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed.html
@@ -154,7 +154,7 @@ Properties
Definition at line 65 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -183,7 +183,7 @@ Properties
Definition at line 35 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -239,7 +239,7 @@ Properties
Definition at line 70 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -268,7 +268,7 @@ Properties
Definition at line 40 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -297,7 +297,7 @@ Properties
Definition at line 45 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -353,7 +353,7 @@ Properties
Definition at line 50 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
@@ -382,7 +382,7 @@ Properties
Definition at line 30 of file ChatEmbed.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_footer.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_footer.html
index 964b15afa7..123b192ae0 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_footer.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_footer.html
@@ -181,7 +181,7 @@ Properties
Definition at line 11 of file ChatEmbedFooter.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_media.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_media.html
index e7b0083e61..cb5d402da3 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_media.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_media.html
@@ -184,7 +184,7 @@ Properties
Definition at line 12 of file ChatEmbedMedia.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_provider.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_provider.html
index fb2a8cd8c5..5e1cb2e5f4 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_provider.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_embed_provider.html
@@ -133,7 +133,7 @@ Properties
Definition at line 11 of file ChatEmbedProvider.cs.
-Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().
+Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.ConvertEmbed().