Add member proxy display names
This commit is contained in:
parent
fabf772085
commit
200ba6d84c
@ -29,7 +29,7 @@ namespace PluralKit.Bot.Commands
|
||||
|
||||
// Warn if member name will be unproxyable (with/without tag)
|
||||
if (memberName.Length > Context.SenderSystem.MaxMemberNameLength) {
|
||||
var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} Member name too long ({memberName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to create it anyway? (You can change the name later)");
|
||||
var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} Member name too long ({memberName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to create it anyway? (You can change the name later, or set a member display name)");
|
||||
if (!await Context.PromptYesNo(msg)) throw new PKError("Member creation cancelled.");
|
||||
}
|
||||
|
||||
@ -58,9 +58,9 @@ namespace PluralKit.Bot.Commands
|
||||
// Hard name length cap
|
||||
if (newName.Length > Limits.MaxMemberNameLength) throw Errors.MemberNameTooLongError(newName.Length);
|
||||
|
||||
// Warn if member name will be unproxyable (with/without tag)
|
||||
if (newName.Length > Context.SenderSystem.MaxMemberNameLength) {
|
||||
var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} New member name too long ({newName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to change it anyway?");
|
||||
// Warn if member name will be unproxyable (with/without tag), only if member doesn't have a display name
|
||||
if (ContextEntity.DisplayName == null && newName.Length > Context.SenderSystem.MaxMemberNameLength) {
|
||||
var msg = await Context.Channel.SendMessageAsync($"{Emojis.Warn} New member name too long ({newName.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), this member will be unproxyable. Do you want to change it anyway? (You can set a member display name instead)");
|
||||
if (!await Context.PromptYesNo(msg)) throw new PKError("Member renaming cancelled.");
|
||||
}
|
||||
|
||||
@ -77,6 +77,7 @@ namespace PluralKit.Bot.Commands
|
||||
|
||||
await Context.Channel.SendMessageAsync($"{Emojis.Success} Member renamed.");
|
||||
if (newName.Contains(" ")) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member's name now contains spaces. You will need to surround it with \"double quotes\" when using commands referring to it.");
|
||||
if (ContextEntity.DisplayName != null) await Context.Channel.SendMessageAsync($"{Emojis.Note} Note that this member has a display name set (`{ContextEntity.DisplayName}`), and will be proxied using that name instead.");
|
||||
}
|
||||
|
||||
[Command("description")]
|
||||
@ -213,6 +214,39 @@ namespace PluralKit.Bot.Commands
|
||||
var embed = url != null ? new EmbedBuilder().WithImageUrl(url).Build() : null;
|
||||
await Context.Channel.SendMessageAsync($"{Emojis.Success} Member avatar {(url == null ? "cleared" : "changed")}.", embed: embed);
|
||||
}
|
||||
|
||||
[Command("displayname")]
|
||||
[Alias("nick", "nickname", "displayname")]
|
||||
[Remarks("member <member> displayname <displayname>")]
|
||||
[MustPassOwnMember]
|
||||
public async Task MemberDisplayName([Remainder] string newDisplayName = null)
|
||||
{
|
||||
// Refuse if proxy name will be unproxyable (with/without tag)
|
||||
if (newDisplayName != null && newDisplayName.Length > Context.SenderSystem.MaxMemberNameLength)
|
||||
throw Errors.DisplayNameTooLong(newDisplayName, Context.SenderSystem.MaxMemberNameLength);
|
||||
|
||||
ContextEntity.DisplayName = newDisplayName;
|
||||
await Members.Save(ContextEntity);
|
||||
|
||||
var successStr = $"{Emojis.Success} ";
|
||||
if (newDisplayName != null)
|
||||
{
|
||||
successStr +=
|
||||
$"Member display name changed. This member will now be proxied using the name `{newDisplayName}`.";
|
||||
}
|
||||
else
|
||||
{
|
||||
successStr += $"Member display name cleared. ";
|
||||
|
||||
// If we're removing display name and the *real* name will be unproxyable, warn.
|
||||
if (ContextEntity.Name.Length > Context.SenderSystem.MaxMemberNameLength)
|
||||
successStr +=
|
||||
$" {Emojis.Warn} This member's actual name is too long ({ContextEntity.Name.Length} > {Context.SenderSystem.MaxMemberNameLength} characters), and thus cannot be proxied.";
|
||||
else
|
||||
successStr += $"This member will now be proxied using their member name `{ContextEntity.Name}.";
|
||||
}
|
||||
await Context.Channel.SendMessageAsync(successStr);
|
||||
}
|
||||
|
||||
[Command]
|
||||
[Alias("view", "show", "info")]
|
||||
|
@ -73,5 +73,8 @@ namespace PluralKit.Bot {
|
||||
public static PKError FrontPercentTimeInFuture => new PKError("Cannot get the front percent between now and a time in the future.");
|
||||
|
||||
public static PKError GuildNotFound(ulong guildId) => new PKError($"Guild with ID {guildId} not found.");
|
||||
|
||||
public static PKError DisplayNameTooLong(string displayName, int maxLength) => new PKError(
|
||||
$"Display name too long ({displayName.Length} > {maxLength} characters). Use a shorter display name, or shorten your system tag.");
|
||||
}
|
||||
}
|
@ -24,8 +24,6 @@ namespace PluralKit.Bot
|
||||
public PKMember Member;
|
||||
public PKSystem System;
|
||||
public string InnerText;
|
||||
|
||||
public string ProxyName => Member.Name + (System.Tag != null ? " " + System.Tag : "");
|
||||
}
|
||||
|
||||
class ProxyService: IDisposable {
|
||||
@ -118,7 +116,8 @@ namespace PluralKit.Bot
|
||||
// Fetch a webhook for this channel, and send the proxied message
|
||||
var webhook = await _webhookCache.GetWebhook(message.Channel as ITextChannel);
|
||||
var avatarUrl = match.Member.AvatarUrl ?? match.System.AvatarUrl;
|
||||
var hookMessageId = await ExecuteWebhook(webhook, messageContents, match.ProxyName, avatarUrl, message.Attachments.FirstOrDefault());
|
||||
var proxyName = match.Member.ProxyName(match.System.Tag);
|
||||
var hookMessageId = await ExecuteWebhook(webhook, messageContents, proxyName, avatarUrl, message.Attachments.FirstOrDefault());
|
||||
|
||||
// Store the message in the database, and log it in the log channel (if applicable)
|
||||
await _messageStorage.Store(message.Author.Id, hookMessageId, message.Channel.Id, message.Id, match.Member);
|
||||
|
@ -7,6 +7,7 @@ namespace PluralKit
|
||||
{
|
||||
public class PKSystem
|
||||
{
|
||||
// Additions here should be mirrored in SystemStore::Save
|
||||
[Key] [JsonIgnore] public int Id { get; set; }
|
||||
[JsonProperty("id")] public string Hid { get; set; }
|
||||
[JsonProperty("name")] public string Name { get; set; }
|
||||
@ -24,12 +25,14 @@ namespace PluralKit
|
||||
|
||||
public class PKMember
|
||||
{
|
||||
// Additions here should be mirrored in MemberStore::Save
|
||||
[JsonIgnore] public int Id { get; set; }
|
||||
[JsonProperty("id")] public string Hid { get; set; }
|
||||
[JsonIgnore] public int System { get; set; }
|
||||
[JsonProperty("color")] public string Color { get; set; }
|
||||
[JsonProperty("avatar_url")] public string AvatarUrl { get; set; }
|
||||
[JsonProperty("name")] public string Name { get; set; }
|
||||
[JsonProperty("display_name")] public string DisplayName { get; set; }
|
||||
[JsonProperty("birthday")] public LocalDate? Birthday { get; set; }
|
||||
[JsonProperty("pronouns")] public string Pronouns { get; set; }
|
||||
[JsonProperty("description")] public string Description { get; set; }
|
||||
@ -52,6 +55,12 @@ namespace PluralKit
|
||||
|
||||
[JsonIgnore] public bool HasProxyTags => Prefix != null || Suffix != null;
|
||||
[JsonIgnore] public string ProxyString => $"{Prefix ?? ""}text{Suffix ?? ""}";
|
||||
|
||||
public string ProxyName(string systemTag)
|
||||
{
|
||||
if (systemTag == null) return DisplayName ?? Name;
|
||||
return $"{DisplayName ?? Name} {systemTag}";
|
||||
}
|
||||
}
|
||||
|
||||
public class PKSwitch
|
||||
|
@ -150,7 +150,7 @@ namespace PluralKit {
|
||||
|
||||
public async Task Save(PKMember member) {
|
||||
using (var conn = await _conn.Obtain())
|
||||
await conn.ExecuteAsync("update members set name = @Name, description = @Description, color = @Color, avatar_url = @AvatarUrl, birthday = @Birthday, pronouns = @Pronouns, prefix = @Prefix, suffix = @Suffix where id = @Id", member);
|
||||
await conn.ExecuteAsync("update members set name = @Name, display_name = @DisplayName, description = @Description, color = @Color, avatar_url = @AvatarUrl, birthday = @Birthday, pronouns = @Pronouns, prefix = @Prefix, suffix = @Suffix where id = @Id", member);
|
||||
|
||||
_logger.Information("Updated member {@Member}", member);
|
||||
}
|
||||
|
@ -242,7 +242,7 @@ namespace PluralKit
|
||||
public static readonly string Warn = "\u26A0";
|
||||
public static readonly string Success = "\u2705";
|
||||
public static readonly string Error = "\u274C";
|
||||
public static readonly string Note = "\u2757";
|
||||
public static readonly string Note = "\U0001f4dd";
|
||||
public static readonly string ThumbsUp = "\U0001f44d";
|
||||
public static readonly string RedQuestion = "\u2753";
|
||||
}
|
||||
|
@ -13,18 +13,19 @@ create table if not exists systems
|
||||
|
||||
create table if not exists members
|
||||
(
|
||||
id serial primary key,
|
||||
hid char(5) unique not null,
|
||||
system serial not null references systems (id) on delete cascade,
|
||||
color char(6),
|
||||
avatar_url text,
|
||||
name text not null,
|
||||
birthday date,
|
||||
pronouns text,
|
||||
description text,
|
||||
prefix text,
|
||||
suffix text,
|
||||
created timestamp not null default (current_timestamp at time zone 'utc')
|
||||
id serial primary key,
|
||||
hid char(5) unique not null,
|
||||
system serial not null references systems (id) on delete cascade,
|
||||
color char(6),
|
||||
avatar_url text,
|
||||
name text not null,
|
||||
display_name text,
|
||||
birthday date,
|
||||
pronouns text,
|
||||
description text,
|
||||
prefix text,
|
||||
suffix text,
|
||||
created timestamp not null default (current_timestamp at time zone 'utc')
|
||||
);
|
||||
|
||||
create table if not exists accounts
|
||||
|
Loading…
Reference in New Issue
Block a user