|
@@ -1,83 +0,0 @@ |
|
|
using System; |
|
|
|
|
|
using System.Collections.Concurrent; |
|
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
|
using System.Linq; |
|
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
|
|
|
namespace Discord.Sessions |
|
|
|
|
|
{ |
|
|
|
|
|
public class SessionsService : IService |
|
|
|
|
|
{ |
|
|
|
|
|
private static readonly DualChannelPermissions _ownerPerm = new DualChannelPermissions() { ReadMessages = true, ManageChannel = true }; |
|
|
|
|
|
private static readonly DualChannelPermissions _memberPerm = new DualChannelPermissions() { ReadMessages = true }; |
|
|
|
|
|
private static readonly DualChannelPermissions _everyonePerm = new DualChannelPermissions() { ReadMessages = false }; |
|
|
|
|
|
|
|
|
|
|
|
private DiscordClient _client; |
|
|
|
|
|
|
|
|
|
|
|
public void Install(DiscordClient client) |
|
|
|
|
|
{ |
|
|
|
|
|
_client = client; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Channel> GetSessions(Server server) |
|
|
|
|
|
=> server.TextChannels.Where(x => x.Name != "" && x.Name[0] == '!'); |
|
|
|
|
|
|
|
|
|
|
|
public async Task<Channel> CreateSession(Server server, string name, bool includeVoice, User owner) |
|
|
|
|
|
{ |
|
|
|
|
|
name = '!' + name; |
|
|
|
|
|
Channel textChannel = await _client.CreateChannel(server, name, ChannelType.Text); |
|
|
|
|
|
Channel voiceChannel = includeVoice ? await _client.CreateChannel(server, name, ChannelType.Voice) : null; |
|
|
|
|
|
|
|
|
|
|
|
//Take away read from everyone |
|
|
|
|
|
await _client.SetChannelPermissions(textChannel, server.EveryoneRole, _everyonePerm); |
|
|
|
|
|
await _client.SetChannelPermissions(textChannel, owner, _ownerPerm); |
|
|
|
|
|
|
|
|
|
|
|
return textChannel; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async Task DestroySession(Channel channel) |
|
|
|
|
|
{ |
|
|
|
|
|
if (channel == null) throw new ArgumentNullException(nameof(channel)); |
|
|
|
|
|
CheckSession(channel); |
|
|
|
|
|
|
|
|
|
|
|
await _client.DeleteChannel(channel); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Task JoinSession(Channel channel, User user) |
|
|
|
|
|
{ |
|
|
|
|
|
if (channel == null) throw new ArgumentNullException(nameof(channel)); |
|
|
|
|
|
if (user == null) throw new ArgumentNullException(nameof(user)); |
|
|
|
|
|
CheckSession(channel); |
|
|
|
|
|
|
|
|
|
|
|
return _client.SetChannelPermissions(channel, user, _memberPerm); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async Task LeaveSession(Channel channel, User user) |
|
|
|
|
|
{ |
|
|
|
|
|
if (channel == null) throw new ArgumentNullException(nameof(channel)); |
|
|
|
|
|
if (user == null) throw new ArgumentNullException(nameof(user)); |
|
|
|
|
|
CheckSession(channel); |
|
|
|
|
|
|
|
|
|
|
|
if (IsOwner(channel, user)) |
|
|
|
|
|
await DestroySession(channel); |
|
|
|
|
|
else |
|
|
|
|
|
await _client.RemoveChannelPermissions(channel, user); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private bool IsSession(Channel channel) |
|
|
|
|
|
=> channel.Name == "" && channel.Name[0] == '!'; |
|
|
|
|
|
private void CheckSession(Channel channel) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!IsSession(channel)) |
|
|
|
|
|
throw new InvalidOperationException("The provided channel is not a session."); |
|
|
|
|
|
} |
|
|
|
|
|
private bool IsOwner(Channel channel, User user) |
|
|
|
|
|
=> _client.GetChannelPermissions(channel, user).ManageMessages == true; |
|
|
|
|
|
/*private IEnumerable<string> GetPermissionUsers(Channel channel) |
|
|
|
|
|
{ |
|
|
|
|
|
return channel.PermissionOverwrites |
|
|
|
|
|
.Where(x => x.TargetType == PermissionTarget.User && x.Allow.Text_ReadMessages) |
|
|
|
|
|
.Select(x => x.TargetId); |
|
|
|
|
|
}*/ |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|