`Message.MentionedRoles` is now populated properly with roles. `Role.IsMentionable` has been added to determine whether `Role.Mention` now mentions roles that are `IsMentionable` as expected (otherwise returns empty string) `Role.Edit` now takes parameter `bool? isMentionable` `Server.CreateRole` now takes parameter `bool isMentionable` `IsMentionable` added to `UpdateRoleRequest`pull/56/head
@@ -19,5 +19,7 @@ namespace Discord.API.Client | |||
public uint? Color { get; set; } | |||
[JsonProperty("managed")] | |||
public bool? Managed { get; set; } | |||
[JsonProperty("mentionable")] | |||
public bool? Mentionable { get; set; } | |||
} | |||
} |
@@ -18,6 +18,8 @@ namespace Discord.API.Client.Rest | |||
public uint Permissions { get; set; } | |||
[JsonProperty("hoist")] | |||
public bool IsHoisted { get; set; } | |||
[JsonProperty("mentionable")] | |||
public bool IsMentionable { get; set; } | |||
[JsonProperty("color")] | |||
public uint Color { get; set; } | |||
@@ -25,7 +25,7 @@ namespace Discord | |||
private static readonly Regex _userRegex = new Regex(@"<@[0-9]+>"); | |||
private static readonly Regex _channelRegex = new Regex(@"<#[0-9]+>"); | |||
private static readonly Regex _roleRegex = new Regex(@"@everyone"); | |||
private static readonly Regex _roleRegex = new Regex(@"<@&[0-9]+>"); | |||
private static readonly Attachment[] _initialAttachments = new Attachment[0]; | |||
private static readonly Embed[] _initialEmbeds = new Embed[0]; | |||
@@ -68,28 +68,36 @@ namespace Discord | |||
return e.Value; //Channel not found or parse failed | |||
})); | |||
} | |||
/*internal static string CleanRoleMentions(User user, Channel channel, string text, List<Role> roles = null) | |||
internal static string CleanRoleMentions(Channel channel, string text, List<Role> roles = null) | |||
{ | |||
var server = channel.Server; | |||
if (server == null) return text; | |||
return _roleRegex.Replace(text, new MatchEvaluator(e => | |||
return _roleRegex.Replace(text, new MatchEvaluator(e => | |||
{ | |||
if (roles != null && user.GetPermissions(channel).MentionEveryone) | |||
roles.Add(server.EveryoneRole); | |||
return e.Value; | |||
ulong id; | |||
if (e.Value.Substring(3, e.Value.Length - 4).TryToId(out id)) | |||
{ | |||
var role = server.GetRole(id); | |||
if (role != null) | |||
{ | |||
if (roles != null) | |||
roles.Add(role); | |||
return "@" + role.Name; | |||
} | |||
} | |||
return e.Value; //Role not found or parse failed | |||
})); | |||
}*/ | |||
} | |||
//TODO: Move this somewhere | |||
private static string Resolve(Channel channel, string text) | |||
{ | |||
if (text == null) throw new ArgumentNullException(nameof(text)); | |||
var client = channel.Client; | |||
text = CleanUserMentions(channel, text); | |||
text = CleanChannelMentions(channel, text); | |||
//text = CleanRoleMentions(Channel, text); | |||
text = CleanRoleMentions(channel, text); | |||
return text; | |||
} | |||
@@ -281,32 +289,28 @@ namespace Discord | |||
.Where(x => x != null) | |||
.ToArray(); | |||
} | |||
if (model.IsMentioningEveryone != null) | |||
{ | |||
if (model.IsMentioningEveryone.Value && User != null && User.GetPermissions(channel).MentionEveryone) | |||
MentionedRoles = new Role[] { Server.EveryoneRole }; | |||
else | |||
MentionedRoles = new Role[0]; | |||
} | |||
if (model.Content != null) | |||
{ | |||
string text = model.Content; | |||
RawText = text; | |||
//var mentionedUsers = new List<User>(); | |||
var mentionedChannels = new List<Channel>(); | |||
//var mentionedRoles = new List<Role>(); | |||
var mentionedRoles = new List<Role>(); | |||
text = CleanUserMentions(Channel, text/*, mentionedUsers*/); | |||
if (server != null) | |||
{ | |||
text = CleanChannelMentions(Channel, text, mentionedChannels); | |||
//text = CleanRoleMentions(_client, User, channel, text, mentionedRoles); | |||
text = CleanRoleMentions(Channel, text, mentionedRoles); | |||
if (model.IsMentioningEveryone != null && model.IsMentioningEveryone.Value | |||
&& User != null && User.GetPermissions(channel).MentionEveryone) | |||
mentionedRoles.Add(Server.EveryoneRole); | |||
} | |||
Text = text; | |||
//MentionedUsers = mentionedUsers; | |||
MentionedChannels = mentionedChannels; | |||
//MentionedRoles = mentionedRoles; | |||
MentionedRoles = mentionedRoles; | |||
} | |||
} | |||
@@ -28,6 +28,8 @@ namespace Discord | |||
public int Position { get; private set; } | |||
/// <summary> Gets whether this role is managed by server (e.g. for Twitch integration) </summary> | |||
public bool IsManaged { get; private set; } | |||
/// <summary> Gets whether this role is mentionable by anyone. </summary> | |||
public bool IsMentionable { get; private set; } | |||
/// <summary> Gets the the permissions given to this role. </summary> | |||
public ServerPermissions Permissions { get; private set; } | |||
/// <summary> Gets the color of this role. </summary> | |||
@@ -41,7 +43,7 @@ namespace Discord | |||
public IEnumerable<User> Members => IsEveryone ? Server.Users : Server.Users.Where(x => x.HasRole(this)); | |||
/// <summary> Gets the string used to mention this role. </summary> | |||
public string Mention => IsEveryone ? "@everyone" : ""; | |||
public string Mention => IsMentionable ? $"<@&{Id}>" : ""; | |||
internal Role(ulong id, Server server) | |||
{ | |||
@@ -60,6 +62,8 @@ namespace Discord | |||
IsHoisted = model.Hoist.Value; | |||
if (model.Managed != null) | |||
IsManaged = model.Managed.Value; | |||
if (model.Mentionable != null) | |||
IsMentionable = model.Mentionable.Value; | |||
if (model.Position != null && !IsEveryone) | |||
Position = model.Position.Value; | |||
if (model.Color != null) | |||
@@ -75,14 +79,15 @@ namespace Discord | |||
} | |||
} | |||
public async Task Edit(string name = null, ServerPermissions? permissions = null, Color color = null, bool? isHoisted = null, int? position = null) | |||
public async Task Edit(string name = null, ServerPermissions? permissions = null, Color color = null, bool? isHoisted = null, int? position = null, bool? isMentionable = null) | |||
{ | |||
var updateRequest = new UpdateRoleRequest(Server.Id, Id) | |||
{ | |||
Name = name ?? Name, | |||
Permissions = (permissions ?? Permissions).RawValue, | |||
Color = (color ?? Color).RawValue, | |||
IsHoisted = isHoisted ?? IsHoisted | |||
IsHoisted = isHoisted ?? IsHoisted, | |||
IsMentionable = isMentionable ?? IsMentionable | |||
}; | |||
var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); | |||
@@ -366,7 +366,7 @@ namespace Discord | |||
} | |||
/// <summary> Creates a new role. </summary> | |||
public async Task<Role> CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false) | |||
public async Task<Role> CreateRole(string name, ServerPermissions? permissions = null, Color color = null, bool isHoisted = false, bool isMentionable = false) | |||
{ | |||
if (name == null) throw new ArgumentNullException(nameof(name)); | |||
@@ -380,7 +380,8 @@ namespace Discord | |||
Name = name, | |||
Permissions = (permissions ?? role.Permissions).RawValue, | |||
Color = (color ?? Color.Default).RawValue, | |||
IsHoisted = isHoisted | |||
IsHoisted = isHoisted, | |||
IsMentionable = isMentionable | |||
}; | |||
var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); | |||
role.Update(editResponse, true); | |||