diff --git a/BirthdayBot/BackgroundWorker.vb b/BirthdayBot/BackgroundWorker.vb
index 212001c..56bd0cd 100644
--- a/BirthdayBot/BackgroundWorker.vb
+++ b/BirthdayBot/BackgroundWorker.vb
@@ -98,12 +98,14 @@ Class BackgroundWorker
Dim role As SocketRole = Nothing
Dim channel As SocketTextChannel = Nothing
Dim announce As (String, String)
+ Dim announceping As Boolean
SyncLock _bot.KnownGuilds
If Not _bot.KnownGuilds.ContainsKey(guild.Id) Then Return 0
Dim gs = _bot.KnownGuilds(guild.Id)
tz = gs.TimeZone
users = gs.Users
announce = gs.AnnounceMessages
+ announceping = gs.AnnouncePing
If gs.AnnounceChannelId.HasValue Then channel = guild.GetTextChannel(gs.AnnounceChannelId.Value)
If gs.RoleId.HasValue Then role = guild.GetRole(gs.RoleId.Value)
@@ -135,7 +137,7 @@ Class BackgroundWorker
End Try
If announceNames.Count <> 0 Then
' Send out announcement message
- Await BirthdayAnnounceAsync(announce, channel, announceNames)
+ Await BirthdayAnnounceAsync(announce, announceping, channel, announceNames)
End If
Return announceNames.Count
@@ -203,8 +205,9 @@ Class BackgroundWorker
Return newBirthdays
End Function
- Private Function BirthdayAnnounceFormatName(member As SocketGuildUser) As String
- ' TODO add option for using pings instead, add handling for it here
+ Private Function BirthdayAnnounceFormatName(member As SocketGuildUser, ping As Boolean) As String
+ If ping Then Return member.Mention
+
Dim escapeFormattingCharacters = Function(input As String) As String
Dim result As New StringBuilder
For Each c As Char In input
@@ -231,6 +234,7 @@ Class BackgroundWorker
''' who have just had their birthday role added.
'''
Private Async Function BirthdayAnnounceAsync(announce As (String, String),
+ announcePing As Boolean,
c As SocketTextChannel,
names As IEnumerable(Of SocketGuildUser)) As Task
If c Is Nothing Then Return
@@ -247,7 +251,7 @@ Class BackgroundWorker
' Build sorted name list
Dim namestrings As New List(Of String)
For Each item In names
- namestrings.Add(BirthdayAnnounceFormatName(item))
+ namestrings.Add(BirthdayAnnounceFormatName(item, announcePing))
Next
namestrings.Sort(StringComparer.OrdinalIgnoreCase)
diff --git a/BirthdayBot/Data/GuildSettings.vb b/BirthdayBot/Data/GuildSettings.vb
index 95b641e..7dccbef 100644
--- a/BirthdayBot/Data/GuildSettings.vb
+++ b/BirthdayBot/Data/GuildSettings.vb
@@ -18,6 +18,7 @@ Friend Class GuildSettings
Private _moderated As Boolean
Private _announceMsg As String
Private _announceMsgPl As String
+ Private _announcePing As Boolean
Private _userCache As Dictionary(Of ULong, GuildUserSettings)
Private _roleWarning As Boolean
@@ -114,6 +115,16 @@ Friend Class GuildSettings
End Get
End Property
+ '''
+ ''' Gets whether to ping users in the announcement message instead of displaying their names.
+ '''
+ '''
+ Public ReadOnly Property AnnouncePing As Boolean
+ Get
+ Return _announcePing
+ End Get
+ End Property
+
' Called by LoadSettingsAsync. Double-check ordinals when changes are made.
Private Sub New(reader As DbDataReader, dbconfig As Database)
_db = dbconfig
@@ -131,6 +142,7 @@ Friend Class GuildSettings
If Not reader.IsDBNull(5) Then _modRole = CULng(reader.GetInt64(5))
_announceMsg = If(reader.IsDBNull(6), Nothing, reader.GetString(6))
_announceMsgPl = If(reader.IsDBNull(7), Nothing, reader.GetString(7))
+ _announcePing = reader.GetBoolean(8)
' Get user information loaded up.
Dim userresult = GuildUserSettings.GetGuildUsersAsync(dbconfig, GuildId)
@@ -276,6 +288,11 @@ Friend Class GuildSettings
Await UpdateDatabaseAsync()
End Function
+ Public Async Function UpdateAnnouncePingAsync(value As Boolean) As Task
+ _announcePing = value
+ Await UpdateDatabaseAsync()
+ End Function
+
#Region "Database"
Public Const BackingTable = "settings"
Public Const BackingTableBans = "banned_users"
@@ -290,7 +307,8 @@ Friend Class GuildSettings
"moderated boolean not null default FALSE, " +
"moderator_role bigint null, " +
"announce_message text null, " +
- "announce_message_pl text null" +
+ "announce_message_pl text null, " +
+ "announce_ping boolean not null default FALSE" +
")"
c.ExecuteNonQuery()
End Using
@@ -312,7 +330,7 @@ Friend Class GuildSettings
Using db = Await dbsettings.OpenConnectionAsync()
Using c = db.CreateCommand()
' Take note of ordinals for use in the constructor
- c.CommandText = "select guild_id, role_id, channel_announce_id, time_zone, moderated, moderator_role, announce_message, announce_message_pl " +
+ c.CommandText = "select guild_id, role_id, channel_announce_id, time_zone, moderated, moderator_role, announce_message, announce_message_pl, announce_ping " +
$"from {BackingTable} where guild_id = @Gid"
c.Parameters.Add("@Gid", NpgsqlDbType.Bigint).Value = guild
c.Prepare()
@@ -349,7 +367,8 @@ Friend Class GuildSettings
"moderated = @Moderated, " +
"moderator_role = @ModRole, " +
"announce_message = @AnnounceMsg, " +
- "announce_message_pl = @AnnounceMsgPl " +
+ "announce_message_pl = @AnnounceMsgPl, " +
+ "announce_ping = @AnnouncePing " +
"where guild_id = @Gid"
c.Parameters.Add("@Gid", NpgsqlDbType.Bigint).Value = GuildId
With c.Parameters.Add("@RoleId", NpgsqlDbType.Bigint)
@@ -395,6 +414,7 @@ Friend Class GuildSettings
.Value = DBNull.Value
End If
End With
+ c.Parameters.Add("@AnnouncePing", NpgsqlDbType.Boolean).Value = _announcePing
c.Prepare()
Await c.ExecuteNonQueryAsync()
End Using
diff --git a/BirthdayBot/UserInterface/HelpInfoCommands.vb b/BirthdayBot/UserInterface/HelpInfoCommands.vb
index 91e8161..299bac5 100644
--- a/BirthdayBot/UserInterface/HelpInfoCommands.vb
+++ b/BirthdayBot/UserInterface/HelpInfoCommands.vb
@@ -68,6 +68,8 @@ Friend Class HelpInfoCommands
" » Sets the announcement channel. Leave blank to disable." + vbLf +
$"{mpfx}message (message)`, `{CommandPrefix}config messagepl (message)`" + vbLf +
$" » Sets a custom announcement message. See `{CommandPrefix}help-message`." + vbLf +
+ $"{mpfx}ping (off|on)`" + vbLf +
+ $" » Sets whether to ping the respective users in the announcement message." + vbLf +
$"{mpfx}zone (time zone name)`" + vbLf +
$" » Sets the default server time zone. See `{CommandPrefix}help-tzdata`."
}
diff --git a/BirthdayBot/UserInterface/ManagerCommands.vb b/BirthdayBot/UserInterface/ManagerCommands.vb
index 980e3e6..9b886c1 100644
--- a/BirthdayBot/UserInterface/ManagerCommands.vb
+++ b/BirthdayBot/UserInterface/ManagerCommands.vb
@@ -25,6 +25,7 @@ Friend Class ManagerCommands
{"modrole", AddressOf ScmdModRole},
{"message", AddressOf ScmdAnnounceMsg},
{"messagepl", AddressOf ScmdAnnounceMsg},
+ {"ping", AddressOf ScmdPing},
{"zone", AddressOf ScmdZone},
{"block", AddressOf ScmdBlock},
{"unblock", AddressOf ScmdBlock},
@@ -87,6 +88,33 @@ Friend Class ManagerCommands
End If
End Function
+ Private Async Function ScmdPing(param As String(), reqChannel As SocketTextChannel) As Task
+ Const inputErr = ":x: You must specify either `off` or `on` in this setting."
+ If param.Length <> 2 Then
+ Await reqChannel.SendMessageAsync(inputErr)
+ Return
+ End If
+
+ Dim input = param(1).ToLower()
+ Dim setting As Boolean
+ Dim result As String
+ If input = "off" Then
+ setting = False
+ result = ":white_check_mark: Announcement pings are now **off**."
+ ElseIf input = "on" Then
+ setting = True
+ result = ":white_check_mark: Announcement pings are now **on**."
+ Else
+ Await reqChannel.SendMessageAsync(inputErr)
+ Return
+ End If
+
+ SyncLock Instance.KnownGuilds
+ Instance.KnownGuilds(reqChannel.Guild.Id).UpdateAnnouncePingAsync(setting).Wait()
+ End SyncLock
+ Await reqChannel.SendMessageAsync(result)
+ End Function
+
' Announcement channel set
Private Async Function ScmdChannel(param As String(), reqChannel As SocketTextChannel) As Task
If param.Length = 1 Then