@@ -19,5 +19,7 @@ namespace Discord.API.Client | |||||
public uint? Color { get; set; } | public uint? Color { get; set; } | ||||
[JsonProperty("managed")] | [JsonProperty("managed")] | ||||
public bool? Managed { get; set; } | 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; } | public uint Permissions { get; set; } | ||||
[JsonProperty("hoist")] | [JsonProperty("hoist")] | ||||
public bool IsHoisted { get; set; } | public bool IsHoisted { get; set; } | ||||
[JsonProperty("mentionable")] | |||||
public bool IsMentionable { get; set; } | |||||
[JsonProperty("color")] | [JsonProperty("color")] | ||||
public uint Color { get; set; } | public uint Color { get; set; } | ||||
@@ -25,7 +25,7 @@ namespace Discord | |||||
private static readonly Regex _userRegex = new Regex(@"<@[0-9]+>"); | private static readonly Regex _userRegex = new Regex(@"<@[0-9]+>"); | ||||
private static readonly Regex _channelRegex = 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 Attachment[] _initialAttachments = new Attachment[0]; | ||||
private static readonly Embed[] _initialEmbeds = new Embed[0]; | private static readonly Embed[] _initialEmbeds = new Embed[0]; | ||||
@@ -68,28 +68,36 @@ namespace Discord | |||||
return e.Value; //Channel not found or parse failed | 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; | var server = channel.Server; | ||||
if (server == null) return text; | 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 | //TODO: Move this somewhere | ||||
private static string Resolve(Channel channel, string text) | private static string Resolve(Channel channel, string text) | ||||
{ | { | ||||
if (text == null) throw new ArgumentNullException(nameof(text)); | if (text == null) throw new ArgumentNullException(nameof(text)); | ||||
var client = channel.Client; | |||||
text = CleanUserMentions(channel, text); | text = CleanUserMentions(channel, text); | ||||
text = CleanChannelMentions(channel, text); | text = CleanChannelMentions(channel, text); | ||||
//text = CleanRoleMentions(Channel, text); | |||||
text = CleanRoleMentions(channel, text); | |||||
return text; | return text; | ||||
} | } | ||||
@@ -281,32 +289,28 @@ namespace Discord | |||||
.Where(x => x != null) | .Where(x => x != null) | ||||
.ToArray(); | .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) | if (model.Content != null) | ||||
{ | { | ||||
string text = model.Content; | string text = model.Content; | ||||
RawText = text; | RawText = text; | ||||
//var mentionedUsers = new List<User>(); | //var mentionedUsers = new List<User>(); | ||||
var mentionedChannels = new List<Channel>(); | var mentionedChannels = new List<Channel>(); | ||||
//var mentionedRoles = new List<Role>(); | |||||
var mentionedRoles = new List<Role>(); | |||||
text = CleanUserMentions(Channel, text/*, mentionedUsers*/); | text = CleanUserMentions(Channel, text/*, mentionedUsers*/); | ||||
if (server != null) | if (server != null) | ||||
{ | { | ||||
text = CleanChannelMentions(Channel, text, mentionedChannels); | 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; | Text = text; | ||||
//MentionedUsers = mentionedUsers; | //MentionedUsers = mentionedUsers; | ||||
MentionedChannels = mentionedChannels; | MentionedChannels = mentionedChannels; | ||||
//MentionedRoles = mentionedRoles; | |||||
MentionedRoles = mentionedRoles; | |||||
} | } | ||||
} | } | ||||
@@ -28,6 +28,8 @@ namespace Discord | |||||
public int Position { get; private set; } | public int Position { get; private set; } | ||||
/// <summary> Gets whether this role is managed by server (e.g. for Twitch integration) </summary> | /// <summary> Gets whether this role is managed by server (e.g. for Twitch integration) </summary> | ||||
public bool IsManaged { get; private set; } | 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> | /// <summary> Gets the the permissions given to this role. </summary> | ||||
public ServerPermissions Permissions { get; private set; } | public ServerPermissions Permissions { get; private set; } | ||||
/// <summary> Gets the color of this role. </summary> | /// <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)); | public IEnumerable<User> Members => IsEveryone ? Server.Users : Server.Users.Where(x => x.HasRole(this)); | ||||
/// <summary> Gets the string used to mention this role. </summary> | /// <summary> Gets the string used to mention this role. </summary> | ||||
public string Mention => IsEveryone ? "@everyone" : ""; | |||||
public string Mention => IsEveryone ? "@everyone" : IsMentionable ? $"<@&{Id}>" : ""; | |||||
internal Role(ulong id, Server server) | internal Role(ulong id, Server server) | ||||
{ | { | ||||
@@ -60,6 +62,8 @@ namespace Discord | |||||
IsHoisted = model.Hoist.Value; | IsHoisted = model.Hoist.Value; | ||||
if (model.Managed != null) | if (model.Managed != null) | ||||
IsManaged = model.Managed.Value; | IsManaged = model.Managed.Value; | ||||
if (model.Mentionable != null) | |||||
IsMentionable = model.Mentionable.Value; | |||||
if (model.Position != null && !IsEveryone) | if (model.Position != null && !IsEveryone) | ||||
Position = model.Position.Value; | Position = model.Position.Value; | ||||
if (model.Color != null) | 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) | var updateRequest = new UpdateRoleRequest(Server.Id, Id) | ||||
{ | { | ||||
Name = name ?? Name, | Name = name ?? Name, | ||||
Permissions = (permissions ?? Permissions).RawValue, | Permissions = (permissions ?? Permissions).RawValue, | ||||
Color = (color ?? Color).RawValue, | Color = (color ?? Color).RawValue, | ||||
IsHoisted = isHoisted ?? IsHoisted | |||||
IsHoisted = isHoisted ?? IsHoisted, | |||||
IsMentionable = isMentionable ?? IsMentionable | |||||
}; | }; | ||||
var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); | var updateResponse = await Client.ClientAPI.Send(updateRequest).ConfigureAwait(false); | ||||
@@ -366,7 +366,7 @@ namespace Discord | |||||
} | } | ||||
/// <summary> Creates a new role. </summary> | /// <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)); | if (name == null) throw new ArgumentNullException(nameof(name)); | ||||
@@ -380,7 +380,8 @@ namespace Discord | |||||
Name = name, | Name = name, | ||||
Permissions = (permissions ?? role.Permissions).RawValue, | Permissions = (permissions ?? role.Permissions).RawValue, | ||||
Color = (color ?? Color.Default).RawValue, | Color = (color ?? Color.Default).RawValue, | ||||
IsHoisted = isHoisted | |||||
IsHoisted = isHoisted, | |||||
IsMentionable = isMentionable | |||||
}; | }; | ||||
var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); | var editResponse = await Client.ClientAPI.Send(editRequest).ConfigureAwait(false); | ||||
role.Update(editResponse, true); | role.Update(editResponse, true); | ||||