tgstation-server 6.19.3
The /tg/station 13 server suite
Loading...
Searching...
No Matches
Classes | Namespaces | Functions | Variables
DiscordProvider.cs File Reference

Go to the source code of this file.

Classes

class  Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider
 IProvider for the Discord app. More...
 

Namespaces

namespace  Tgstation
 
namespace  Tgstation.Server
 
namespace  Tgstation.Server.Host
 
namespace  Tgstation.Server.Host.Components
 
namespace  Tgstation.Server.Host.Components.Chat
 
namespace  Tgstation.Server.Host.Components.Chat.Providers
 

Functions

 Tgstation.Server.Host.Components.Chat.Providers.if (removedTestMerges.Count !=0) fields.Add(new EmbedField("Removed
 
 Tgstation.Server.Host.Components.Chat.Providers.[instance initializer]
 
Optional< IReadOnlyList< IEmbed > > ConvertEmbed (ChatEmbed? embed)
 Convert a ChatEmbed to an IEmbed parameters.
 

Variables

 Tgstation.Server.Host.Components.Chat.Providers.false
 

Function Documentation

◆ ConvertEmbed()

Optional< IReadOnlyList< IEmbed > > ConvertEmbed ( ChatEmbed?  embed)

Convert a ChatEmbed to an IEmbed parameters.

Parameters
embedThe ChatEmbed to convert.
Returns
The parameter for sending a single IEmbed.

Definition at line 1491 of file DiscordProvider.cs.

1492 {
1493 if (embed == null)
1494 return default;
1495
1496 var embedErrors = new List<string>();
1497 Optional<Color> colour = default;
1498 if (embed.Colour != null)
1499 if (Int32.TryParse(embed.Colour[1..], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var argb))
1500 colour = Color.FromArgb(argb);
1501 else
1502 embedErrors.Add(
1503 String.Format(
1504 CultureInfo.InvariantCulture,
1505 "Invalid embed colour: {0}",
1506 embed.Colour));
1507
1508 if (embed.Author != null && String.IsNullOrWhiteSpace(embed.Author.Name))
1509 {
1510 embedErrors.Add("Null or whitespace embed author name!");
1511 embed.Author = null;
1512 }
1513
1514 List<IEmbedField>? fields = null;
1515 if (embed.Fields != null)
1516 {
1517 fields = new List<IEmbedField>();
1518 var i = -1;
1519 foreach (var field in embed.Fields)
1520 {
1521 ++i;
1522 var invalid = false;
1523 if (String.IsNullOrWhiteSpace(field.Name))
1524 {
1525 embedErrors.Add(
1526 String.Format(
1527 CultureInfo.InvariantCulture,
1528 "Null or whitespace field name at index {0}!",
1529 i));
1530 invalid = true;
1531 }
1532
1533 if (String.IsNullOrWhiteSpace(field.Value))
1534 {
1535 embedErrors.Add(
1536 String.Format(
1537 CultureInfo.InvariantCulture,
1538 "Null or whitespace field value at index {0}!",
1539 i));
1540 invalid = true;
1541 }
1542
1543 if (invalid)
1544 continue;
1545
1546 fields.Add(new EmbedField(field.Name!, field.Value!)
1547 {
1548 IsInline = field.IsInline ?? default(Optional<bool>),
1549 });
1550 }
1551 }
1552
1553 if (embed.Footer != null && String.IsNullOrWhiteSpace(embed.Footer.Text))
1554 {
1555 embedErrors.Add("Null or whitespace embed footer text!");
1556 embed.Footer = null;
1557 }
1558
1559 if (embed.Image != null && String.IsNullOrWhiteSpace(embed.Image.Url))
1560 {
1561 embedErrors.Add("Null or whitespace embed image url!");
1562 embed.Image = null;
1563 }
1564
1565 if (embed.Thumbnail != null && String.IsNullOrWhiteSpace(embed.Thumbnail.Url))
1566 {
1567 embedErrors.Add("Null or whitespace embed thumbnail url!");
1568 embed.Thumbnail = null;
1569 }
1570
1571 Optional<DateTimeOffset> timestampOptional = default;
1572 if (embed.Timestamp != null)
1573 if (DateTimeOffset.TryParse(embed.Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var timestamp))
1574 timestampOptional = timestamp.ToUniversalTime();
1575 else
1576 embedErrors.Add(
1577 String.Format(
1578 CultureInfo.InvariantCulture,
1579 "Invalid embed timestamp: {0}",
1580 embed.Timestamp));
1581
1582 var discordEmbed = new Embed
1583 {
1584 Author = embed.Author != null
1585 ? new EmbedAuthor(embed.Author.Name!)
1586 {
1587 IconUrl = embed.Author.IconUrl ?? default(Optional<string>),
1588 ProxyIconUrl = embed.Author.ProxyIconUrl ?? default(Optional<string>),
1589 Url = embed.Author.Url ?? default(Optional<string>),
1590 }
1591 : default(Optional<IEmbedAuthor>),
1592 Colour = colour,
1593 Description = embed.Description ?? default(Optional<string>),
1594 Fields = fields ?? default(Optional<IReadOnlyList<IEmbedField>>),
1595 Footer = embed.Footer != null
1596 ? (Optional<IEmbedFooter>)new EmbedFooter(embed.Footer.Text!)
1597 {
1598 IconUrl = embed.Footer.IconUrl ?? default(Optional<string>),
1599 ProxyIconUrl = embed.Footer.ProxyIconUrl ?? default(Optional<string>),
1600 }
1601 : default,
1602 Image = embed.Image != null
1603 ? new EmbedImage(embed.Image.Url!)
1604 {
1605 Width = embed.Image.Width ?? default(Optional<int>),
1606 Height = embed.Image.Height ?? default(Optional<int>),
1607 ProxyUrl = embed.Image.ProxyUrl ?? default(Optional<string>),
1608 }
1609 : default(Optional<IEmbedImage>),
1610 Provider = embed.Provider != null
1611 ? new EmbedProvider
1612 {
1613 Name = embed.Provider.Name ?? default(Optional<string>),
1614 Url = embed.Provider.Url ?? default(Optional<string>),
1615 }
1616 : default(Optional<IEmbedProvider>),
1617 Thumbnail = embed.Thumbnail != null
1618 ? new EmbedThumbnail(embed.Thumbnail.Url!)
1619 {
1620 Width = embed.Thumbnail.Width ?? default(Optional<int>),
1621 Height = embed.Thumbnail.Height ?? default(Optional<int>),
1622 ProxyUrl = embed.Thumbnail.ProxyUrl ?? default(Optional<string>),
1623 }
1624 : default(Optional<IEmbedThumbnail>),
1625 Timestamp = timestampOptional,
1626 Title = embed.Title ?? default(Optional<string>),
1627 Url = embed.Url ?? default(Optional<string>),
1628 Video = embed.Video != null
1629 ? new EmbedVideo
1630 {
1631 Url = embed.Video.Url ?? default(Optional<string>),
1632 Width = embed.Video.Width ?? default(Optional<int>),
1633 Height = embed.Video.Height ?? default(Optional<int>),
1634 ProxyUrl = embed.Video.ProxyUrl ?? default(Optional<string>),
1635 }
1636 : default(Optional<IEmbedVideo>),
1637 };
1638
1639 var result = new List<IEmbed> { discordEmbed };
1640
1641 if (embedErrors.Count > 0)
1642 {
1643 var joinedErrors = String.Join(Environment.NewLine, embedErrors);
1644 Logger.LogError("Embed description contains errors:{newLine}{issues}", Environment.NewLine, joinedErrors);
1645 result.Add(new Embed
1646 {
1647 Title = "TGS Embed Errors",
1648 Description = joinedErrors,
1649 Colour = Color.Red,
1650 Footer = new EmbedFooter("Please report this to your codebase's maintainers."),
1651 Timestamp = DateTimeOffset.UtcNow,
1652 });
1653 }
1654
1655 return result;
1656 }
@ Optional
DMAPI validation is performed but not required for the deployment to succeed.

References Tgstation.Server.Host.Components.Interop.ChatEmbed.Author, Tgstation.Server.Host.Components.Interop.ChatEmbed.Colour, Tgstation.Server.Host.Components.Interop.ChatEmbed.Fields, Tgstation.Server.Host.Components.Interop.ChatEmbed.Footer, Tgstation.Server.Host.Components.Interop.ChatEmbed.Image, Tgstation.Server.Host.Components.Chat.Providers.Provider.Logger, Tgstation.Server.Host.Components.Interop.ChatEmbedProvider.Name, Tgstation.Server.Api.Models.Optional, Tgstation.Server.Host.Components.Interop.ChatEmbedFooter.Text, Tgstation.Server.Host.Components.Interop.ChatEmbed.Thumbnail, Tgstation.Server.Host.Components.Interop.ChatEmbed.Timestamp, and Tgstation.Server.Host.Components.Interop.ChatEmbedMedia.Url.

Referenced by Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.SendMessage().

Here is the caller graph for this function: