~ani, ~mang, and @nadekobot how are you are the only things that don't work now
This commit is contained in:
parent
81b27988d9
commit
ffb63f9e81
10
NadekoBot/Classes/JSONModels/Config.cs
Normal file
10
NadekoBot/Classes/JSONModels/Config.cs
Normal file
@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NadekoBot.Classes.JSONModels {
|
||||
internal class Config {
|
||||
}
|
||||
}
|
@ -21,7 +21,7 @@ namespace NadekoBot.Classes.Music {
|
||||
/// </summary>
|
||||
public class PoopyBuffer {
|
||||
|
||||
private byte[] ringBuffer;
|
||||
private readonly byte[] ringBuffer;
|
||||
|
||||
public int WritePosition { get; private set; } = 0;
|
||||
public int ReadPosition { get; private set; } = 0;
|
||||
@ -70,13 +70,13 @@ namespace NadekoBot.Classes.Music {
|
||||
return count;
|
||||
}
|
||||
// B: if i can't read as much, read to the end,
|
||||
int readNormaly = BufferSize - ReadPosition;
|
||||
var readNormaly = BufferSize - ReadPosition;
|
||||
Buffer.BlockCopy(ringBuffer, ReadPosition, buffer, 0, readNormaly);
|
||||
|
||||
//Console.WriteLine($"Read normaly {count}[{ReadPosition} to {ReadPosition + readNormaly}]");
|
||||
//then read the remaining amount from the start
|
||||
|
||||
int readFromStart = count - readNormaly;
|
||||
var readFromStart = count - readNormaly;
|
||||
Buffer.BlockCopy(ringBuffer, 0, buffer, readNormaly, readFromStart);
|
||||
//Console.WriteLine($"Read From start {readFromStart}[{0} to {readFromStart}]");
|
||||
ReadPosition = readFromStart;
|
||||
@ -88,7 +88,7 @@ namespace NadekoBot.Classes.Music {
|
||||
if (count > buffer.Length)
|
||||
throw new ArgumentException();
|
||||
while (ContentLength + count > BufferSize) {
|
||||
await Task.Delay(20);
|
||||
await Task.Delay(20, cancelToken);
|
||||
if (cancelToken.IsCancellationRequested)
|
||||
return;
|
||||
}
|
||||
@ -104,12 +104,12 @@ namespace NadekoBot.Classes.Music {
|
||||
}
|
||||
// otherwise, i have to write to the end, then write the rest from the start
|
||||
|
||||
int wroteNormaly = BufferSize - WritePosition;
|
||||
var wroteNormaly = BufferSize - WritePosition;
|
||||
Buffer.BlockCopy(buffer, 0, ringBuffer, WritePosition, wroteNormaly);
|
||||
|
||||
//Console.WriteLine($"Wrote normally {wroteNormaly}[{WritePosition} to {BufferSize}]");
|
||||
|
||||
int wroteFromStart = count - wroteNormaly;
|
||||
var wroteFromStart = count - wroteNormaly;
|
||||
Buffer.BlockCopy(buffer, wroteNormaly, ringBuffer, 0, wroteFromStart);
|
||||
|
||||
//Console.WriteLine($"and from start {wroteFromStart} [0 to {wroteFromStart}");
|
||||
@ -145,27 +145,25 @@ namespace NadekoBot.Classes.Music {
|
||||
RedirectStandardError = false,
|
||||
CreateNoWindow = true,
|
||||
});
|
||||
int blockSize = 3840;
|
||||
byte[] buffer = new byte[blockSize];
|
||||
int attempt = 0;
|
||||
var blockSize = 3840;
|
||||
var buffer = new byte[blockSize];
|
||||
var attempt = 0;
|
||||
while (!cancelToken.IsCancellationRequested) {
|
||||
int read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken);
|
||||
var read = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, blockSize, cancelToken);
|
||||
if (read == 0)
|
||||
if (attempt++ == 20)
|
||||
break;
|
||||
else
|
||||
await Task.Delay(50);
|
||||
await Task.Delay(50, cancelToken);
|
||||
else
|
||||
attempt = 0;
|
||||
await songBuffer.WriteAsync(buffer, read, cancelToken);
|
||||
if (songBuffer.ContentLength > 2.MB())
|
||||
prebufferingComplete = true;
|
||||
}
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
Console.WriteLine("Buffering errored");
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
if (p != null) {
|
||||
p.CancelOutputRead();
|
||||
p.StandardOutput.Dispose();
|
||||
@ -179,34 +177,33 @@ namespace NadekoBot.Classes.Music {
|
||||
|
||||
internal async Task Play(IAudioClient voiceClient, CancellationToken cancelToken) {
|
||||
var t = BufferSong(cancelToken).ConfigureAwait(false);
|
||||
int bufferAttempts = 0;
|
||||
int waitPerAttempt = 500;
|
||||
int toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9;
|
||||
var bufferAttempts = 0;
|
||||
const int waitPerAttempt = 500;
|
||||
var toAttemptTimes = SongInfo.ProviderType != MusicType.Normal ? 5 : 9;
|
||||
while (!prebufferingComplete && bufferAttempts++ < toAttemptTimes) {
|
||||
await Task.Delay(waitPerAttempt, cancelToken);
|
||||
}
|
||||
cancelToken.ThrowIfCancellationRequested();
|
||||
Console.WriteLine($"Prebuffering done? in {waitPerAttempt * bufferAttempts}");
|
||||
int blockSize = 3840;
|
||||
byte[] buffer = new byte[blockSize];
|
||||
int attempt = 0;
|
||||
var blockSize = 3840;
|
||||
var buffer = new byte[blockSize];
|
||||
var attempt = 0;
|
||||
while (!cancelToken.IsCancellationRequested) {
|
||||
//Console.WriteLine($"Read: {songBuffer.ReadPosition}\nWrite: {songBuffer.WritePosition}\nContentLength:{songBuffer.ContentLength}\n---------");
|
||||
int read = songBuffer.Read(buffer, blockSize);
|
||||
var read = songBuffer.Read(buffer, blockSize);
|
||||
if (read == 0)
|
||||
if (attempt++ == 20) {
|
||||
voiceClient.Wait();
|
||||
Console.WriteLine("Nothing to read.");
|
||||
return;
|
||||
}
|
||||
else
|
||||
await Task.Delay(50);
|
||||
} else
|
||||
await Task.Delay(50, cancelToken);
|
||||
else
|
||||
attempt = 0;
|
||||
|
||||
while (this.MusicPlayer.Paused)
|
||||
await Task.Delay(200, cancelToken);
|
||||
buffer = adjustVolume(buffer, MusicPlayer.Volume);
|
||||
buffer = AdjustVolume(buffer, MusicPlayer.Volume);
|
||||
voiceClient.Send(buffer, 0, read);
|
||||
}
|
||||
cancelToken.ThrowIfCancellationRequested();
|
||||
@ -220,11 +217,11 @@ namespace NadekoBot.Classes.Music {
|
||||
}
|
||||
|
||||
//stackoverflow ftw
|
||||
private byte[] adjustVolume(byte[] audioSamples, float volume) {
|
||||
if (volume == 1.0f)
|
||||
private static byte[] AdjustVolume(byte[] audioSamples, float volume) {
|
||||
if (Math.Abs(volume - 1.0f) < 0.01f)
|
||||
return audioSamples;
|
||||
byte[] array = new byte[audioSamples.Length];
|
||||
for (int i = 0; i < array.Length; i += 2) {
|
||||
var array = new byte[audioSamples.Length];
|
||||
for (var i = 0; i < array.Length; i += 2) {
|
||||
|
||||
// convert byte pair to int
|
||||
short buf1 = audioSamples[i + 1];
|
||||
@ -233,7 +230,7 @@ namespace NadekoBot.Classes.Music {
|
||||
buf1 = (short)((buf1 & 0xff) << 8);
|
||||
buf2 = (short)(buf2 & 0xff);
|
||||
|
||||
short res = (short)(buf1 | buf2);
|
||||
var res = (short)(buf1 | buf2);
|
||||
res = (short)(res * volume);
|
||||
|
||||
// convert back
|
||||
@ -254,23 +251,23 @@ namespace NadekoBot.Classes.Music {
|
||||
}
|
||||
|
||||
try {
|
||||
if (musicType == MusicType.Local) {
|
||||
return new Song(new SongInfo {
|
||||
Uri = "\"" + Path.GetFullPath(query) + "\"",
|
||||
Title = Path.GetFileNameWithoutExtension(query),
|
||||
Provider = "Local File",
|
||||
ProviderType = musicType,
|
||||
});
|
||||
switch (musicType) {
|
||||
case MusicType.Local:
|
||||
return new Song(new SongInfo {
|
||||
Uri = "\"" + Path.GetFullPath(query) + "\"",
|
||||
Title = Path.GetFileNameWithoutExtension(query),
|
||||
Provider = "Local File",
|
||||
ProviderType = musicType,
|
||||
});
|
||||
case MusicType.Radio:
|
||||
return new Song(new SongInfo {
|
||||
Uri = query,
|
||||
Title = $"{query}",
|
||||
Provider = "Radio Stream",
|
||||
ProviderType = musicType,
|
||||
});
|
||||
}
|
||||
else if (musicType == MusicType.Radio) {
|
||||
return new Song(new SongInfo {
|
||||
Uri = query,
|
||||
Title = $"{query}",
|
||||
Provider = "Radio Stream",
|
||||
ProviderType = musicType,
|
||||
});
|
||||
}
|
||||
else if (SoundCloud.Default.IsSoundCloudLink(query)) {
|
||||
if (SoundCloud.Default.IsSoundCloudLink(query)) {
|
||||
var svideo = await SoundCloud.Default.GetVideoAsync(query);
|
||||
return new Song(new SongInfo {
|
||||
Title = svideo.FullName,
|
||||
@ -279,29 +276,25 @@ namespace NadekoBot.Classes.Music {
|
||||
ProviderType = musicType,
|
||||
});
|
||||
}
|
||||
else {
|
||||
var links = await SearchHelper.FindYoutubeUrlByKeywords(query);
|
||||
if (links == String.Empty)
|
||||
throw new OperationCanceledException("Not a valid youtube query.");
|
||||
var allVideos = await Task.Factory.StartNew(async () => await YouTube.Default.GetAllVideosAsync(links)).Unwrap();
|
||||
var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio);
|
||||
var video = videos
|
||||
.Where(v => v.AudioBitrate < 192)
|
||||
.OrderByDescending(v => v.AudioBitrate)
|
||||
.FirstOrDefault();
|
||||
var links = await SearchHelper.FindYoutubeUrlByKeywords(query);
|
||||
if (links == String.Empty)
|
||||
throw new OperationCanceledException("Not a valid youtube query.");
|
||||
var allVideos = await Task.Factory.StartNew(async () => await YouTube.Default.GetAllVideosAsync(links)).Unwrap();
|
||||
var videos = allVideos.Where(v => v.AdaptiveKind == AdaptiveKind.Audio);
|
||||
var video = videos
|
||||
.Where(v => v.AudioBitrate < 192)
|
||||
.OrderByDescending(v => v.AudioBitrate)
|
||||
.FirstOrDefault();
|
||||
|
||||
if (video == null) // do something with this error
|
||||
throw new Exception("Could not load any video elements based on the query.");
|
||||
return new Song(new SongInfo {
|
||||
Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube"
|
||||
Provider = "YouTube",
|
||||
Uri = video.Uri,
|
||||
ProviderType = musicType,
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex) {
|
||||
if (video == null) // do something with this error
|
||||
throw new Exception("Could not load any video elements based on the query.");
|
||||
return new Song(new SongInfo {
|
||||
Title = video.Title.Substring(0, video.Title.Length - 10), // removing trailing "- You Tube"
|
||||
Provider = "YouTube",
|
||||
Uri = video.Uri,
|
||||
ProviderType = musicType,
|
||||
});
|
||||
} catch (Exception ex) {
|
||||
Console.WriteLine($"Failed resolving the link.{ex.Message}");
|
||||
return null;
|
||||
}
|
||||
@ -311,8 +304,7 @@ namespace NadekoBot.Classes.Music {
|
||||
string file = null;
|
||||
try {
|
||||
file = await SearchHelper.GetResponseStringAsync(query);
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
return query;
|
||||
}
|
||||
if (query.Contains(".pls")) {
|
||||
@ -322,13 +314,12 @@ namespace NadekoBot.Classes.Music {
|
||||
var m = Regex.Match(file, "File1=(?<url>.*?)\\n");
|
||||
var res = m.Groups["url"]?.ToString();
|
||||
return res?.Trim();
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
Console.WriteLine($"Failed reading .pls:\n{file}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (query.Contains(".m3u")) {
|
||||
if (query.Contains(".m3u")) {
|
||||
/*
|
||||
# This is a comment
|
||||
C:\xxx4xx\xxxxxx3x\xx2xxxx\xx.mp3
|
||||
@ -338,26 +329,24 @@ namespace NadekoBot.Classes.Music {
|
||||
var m = Regex.Match(file, "(?<url>^[^#].*)", RegexOptions.Multiline);
|
||||
var res = m.Groups["url"]?.ToString();
|
||||
return res?.Trim();
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
Console.WriteLine($"Failed reading .m3u:\n{file}");
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
else if (query.Contains(".asx")) {
|
||||
if (query.Contains(".asx")) {
|
||||
//<ref href="http://armitunes.com:8000"/>
|
||||
try {
|
||||
var m = Regex.Match(file, "<ref href=\"(?<url>.*?)\"");
|
||||
var res = m.Groups["url"]?.ToString();
|
||||
return res?.Trim();
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
Console.WriteLine($"Failed reading .asx:\n{file}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (query.Contains(".xspf")) {
|
||||
if (query.Contains(".xspf")) {
|
||||
/*
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<playlist version="1" xmlns="http://xspf.org/ns/0/">
|
||||
@ -368,8 +357,7 @@ namespace NadekoBot.Classes.Music {
|
||||
var m = Regex.Match(file, "<location>(?<url>.*?)</location>");
|
||||
var res = m.Groups["url"]?.ToString();
|
||||
return res?.Trim();
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
Console.WriteLine($"Failed reading .xspf:\n{file}");
|
||||
return null;
|
||||
}
|
||||
|
@ -15,8 +15,8 @@ namespace NadekoBot.Classes.Permissions {
|
||||
public PermissionChecker() {
|
||||
Task.Run(async () => {
|
||||
while (true) {
|
||||
//blacklist is cleared every 1.3 seconds. That is the most time anyone will be blocked for ever
|
||||
await Task.Delay(1300);
|
||||
//blacklist is cleared every 1.75 seconds. That is the most time anyone will be blocked for ever
|
||||
await Task.Delay(1750);
|
||||
timeBlackList.Clear();
|
||||
}
|
||||
});
|
||||
@ -45,7 +45,7 @@ namespace NadekoBot.Classes.Permissions {
|
||||
if (user.Server.Owner.Id == user.Id || (role != null && user.HasRole(role)))
|
||||
return true;
|
||||
ServerPermissions perms;
|
||||
PermissionsHandler._permissionsDict.TryGetValue(user.Server.Id, out perms);
|
||||
PermissionsHandler.PermissionsDict.TryGetValue(user.Server.Id, out perms);
|
||||
throw new Exception($"You don't have the necessary role (**{(perms?.PermissionsControllerRole ?? "Nadeko")}**) to change permissions.");
|
||||
}
|
||||
|
||||
@ -83,11 +83,11 @@ namespace NadekoBot.Classes.Permissions {
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
if (PermissionsHandler._permissionsDict[user.Server.Id].Verbose) //if verbose - print errors
|
||||
if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors
|
||||
error = msg;
|
||||
return false;
|
||||
} catch (Exception ex) {
|
||||
if (PermissionsHandler._permissionsDict[user.Server.Id].Verbose) //if verbose - print errors
|
||||
if (PermissionsHandler.PermissionsDict[user.Server.Id].Verbose) //if verbose - print errors
|
||||
error = ex.Message;
|
||||
return false;
|
||||
}
|
||||
|
@ -4,12 +4,13 @@ using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Discord.Commands;
|
||||
|
||||
namespace NadekoBot.Classes.Permissions {
|
||||
public static class PermissionsHandler {
|
||||
public static ConcurrentDictionary<ulong, ServerPermissions> _permissionsDict =
|
||||
public static ConcurrentDictionary<ulong, ServerPermissions> PermissionsDict =
|
||||
new ConcurrentDictionary<ulong, ServerPermissions>();
|
||||
|
||||
public enum PermissionBanType {
|
||||
@ -25,19 +26,18 @@ namespace NadekoBot.Classes.Permissions {
|
||||
foreach (var file in Directory.EnumerateFiles("data/permissions/")) {
|
||||
try {
|
||||
var strippedFileName = Path.GetFileNameWithoutExtension(file);
|
||||
if (string.IsNullOrWhiteSpace(strippedFileName)) continue;
|
||||
var id = ulong.Parse(strippedFileName);
|
||||
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<ServerPermissions>(File.ReadAllText(file));
|
||||
_permissionsDict.TryAdd(id, data);
|
||||
} catch (Exception ex) {
|
||||
//Console.WriteLine($"Failed getting server with id: {file}\nReason: {ex.Message}");
|
||||
}
|
||||
PermissionsDict.TryAdd(id, data);
|
||||
} catch { }
|
||||
}
|
||||
Console.WriteLine("Permission initialization complete.");
|
||||
}
|
||||
|
||||
internal static Permissions GetRolePermissionsById(Server server, ulong id) {
|
||||
ServerPermissions serverPerms;
|
||||
if (!_permissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
return null;
|
||||
|
||||
Permissions toReturn;
|
||||
@ -47,7 +47,7 @@ namespace NadekoBot.Classes.Permissions {
|
||||
|
||||
internal static Permissions GetUserPermissionsById(Server server, ulong id) {
|
||||
ServerPermissions serverPerms;
|
||||
if (!_permissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
return null;
|
||||
|
||||
Permissions toReturn;
|
||||
@ -57,7 +57,7 @@ namespace NadekoBot.Classes.Permissions {
|
||||
|
||||
internal static Permissions GetChannelPermissionsById(Server server, ulong id) {
|
||||
ServerPermissions serverPerms;
|
||||
if (!_permissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
if (!PermissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
return null;
|
||||
|
||||
Permissions toReturn;
|
||||
@ -67,32 +67,29 @@ namespace NadekoBot.Classes.Permissions {
|
||||
|
||||
internal static Permissions GetServerPermissions(Server server) {
|
||||
ServerPermissions serverPerms;
|
||||
if (!_permissionsDict.TryGetValue(server.Id, out serverPerms))
|
||||
return null;
|
||||
|
||||
return serverPerms.Permissions;
|
||||
return !PermissionsDict.TryGetValue(server.Id, out serverPerms) ? null : serverPerms.Permissions;
|
||||
}
|
||||
|
||||
internal static PermissionBanType GetPermissionBanType(Command command, User user, Channel channel) {
|
||||
var server = user.Server;
|
||||
ServerPermissions serverPerms;
|
||||
if (!_permissionsDict.TryGetValue(server.Id,out serverPerms)) {
|
||||
if (!PermissionsDict.TryGetValue(server.Id, out serverPerms)) {
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name);
|
||||
_permissionsDict.TryAdd(server.Id, serverPerms);
|
||||
PermissionsDict.TryAdd(server.Id, serverPerms);
|
||||
}
|
||||
bool val;
|
||||
Permissions perm;
|
||||
//server
|
||||
if (serverPerms.Permissions.modules.TryGetValue(command.Category, out val) && val == false)
|
||||
if (serverPerms.Permissions.Modules.TryGetValue(command.Category, out val) && val == false)
|
||||
return PermissionBanType.ServerBanModule;
|
||||
if (serverPerms.Permissions.commands.TryGetValue(command.Text, out val) && val == false)
|
||||
if (serverPerms.Permissions.Commands.TryGetValue(command.Text, out val) && val == false)
|
||||
return PermissionBanType.ServerBanCommand;
|
||||
//channel
|
||||
if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) &&
|
||||
perm.modules.TryGetValue(command.Category, out val) && val == false)
|
||||
perm.Modules.TryGetValue(command.Category, out val) && val == false)
|
||||
return PermissionBanType.ChannelBanModule;
|
||||
if (serverPerms.ChannelPermissions.TryGetValue(channel.Id, out perm) &&
|
||||
perm.commands.TryGetValue(command.Text, out val) && val == false)
|
||||
perm.Commands.TryGetValue(command.Text, out val) && val == false)
|
||||
return PermissionBanType.ChannelBanCommand;
|
||||
|
||||
//ROLE PART - TWO CASES
|
||||
@ -101,16 +98,14 @@ namespace NadekoBot.Classes.Permissions {
|
||||
// THAT MEANS USER CANNOT RUN THIS COMMAND
|
||||
// IF AT LEAST ONE ROLE EXIST THAT IS NOT BANNED,
|
||||
// USER CAN RUN THE COMMAND
|
||||
bool foundNotBannedRole = false;
|
||||
var foundNotBannedRole = false;
|
||||
foreach (var role in user.Roles) {
|
||||
//if every role is banned from using the module -> rolebanmodule
|
||||
if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) &&
|
||||
perm.modules.TryGetValue(command.Category, out val) && val == false)
|
||||
perm.Modules.TryGetValue(command.Category, out val) && val == false)
|
||||
continue;
|
||||
else {
|
||||
foundNotBannedRole = true;
|
||||
break;
|
||||
}
|
||||
foundNotBannedRole = true;
|
||||
break;
|
||||
}
|
||||
if (!foundNotBannedRole)
|
||||
return PermissionBanType.RoleBanModule;
|
||||
@ -124,7 +119,7 @@ namespace NadekoBot.Classes.Permissions {
|
||||
foreach (var role in user.Roles) {
|
||||
//if every role is banned from using the module -> rolebanmodule
|
||||
if (serverPerms.RolePermissions.TryGetValue(role.Id, out perm) &&
|
||||
perm.commands.TryGetValue(command.Text, out val) && val == false)
|
||||
perm.Commands.TryGetValue(command.Text, out val) && val == false)
|
||||
continue;
|
||||
else {
|
||||
foundNotBannedRole = true;
|
||||
@ -136,169 +131,175 @@ namespace NadekoBot.Classes.Permissions {
|
||||
|
||||
//user
|
||||
if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) &&
|
||||
perm.modules.TryGetValue(command.Category, out val) && val == false)
|
||||
perm.Modules.TryGetValue(command.Category, out val) && val == false)
|
||||
return PermissionBanType.UserBanModule;
|
||||
if (serverPerms.UserPermissions.TryGetValue(user.Id, out perm) &&
|
||||
perm.commands.TryGetValue(command.Text, out val) && val == false)
|
||||
perm.Commands.TryGetValue(command.Text, out val) && val == false)
|
||||
return PermissionBanType.UserBanCommand;
|
||||
|
||||
return PermissionBanType.None;
|
||||
}
|
||||
|
||||
private static void WriteServerToJson(ulong serverId) {
|
||||
string pathToFile = $"data/permissions/{serverId}.json";
|
||||
File.WriteAllText(pathToFile, Newtonsoft.Json.JsonConvert.SerializeObject(_permissionsDict[serverId], Newtonsoft.Json.Formatting.Indented));
|
||||
private static void WriteServerToJson(ServerPermissions serverPerms) {
|
||||
string pathToFile = $"data/permissions/{serverPerms}.json";
|
||||
File.WriteAllText(pathToFile,
|
||||
Newtonsoft.Json.JsonConvert.SerializeObject(serverPerms, Newtonsoft.Json.Formatting.Indented));
|
||||
}
|
||||
|
||||
public static void WriteToJson() {
|
||||
Directory.CreateDirectory("data/permissions/");
|
||||
foreach (var kvp in _permissionsDict) {
|
||||
WriteServerToJson(kvp.Key);
|
||||
foreach (var kvp in PermissionsDict) {
|
||||
WriteServerToJson(kvp.Value);
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetServerPermissionsRoleName(Server server) {
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
return serverPerms.PermissionsControllerRole;
|
||||
}
|
||||
|
||||
internal static void SetPermissionsRole(Server server, string roleName) {
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
serverPerms.PermissionsControllerRole = roleName;
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
internal static void SetVerbosity(Server server, bool val) {
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
serverPerms.Verbose = val;
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetServerModulePermission(Server server, string moduleName, bool value) {
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var modules = serverPerms.Permissions.modules;
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
var modules = serverPerms.Permissions.Modules;
|
||||
if (modules.ContainsKey(moduleName))
|
||||
modules[moduleName] = value;
|
||||
else
|
||||
modules.Add(moduleName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetServerCommandPermission(Server server, string commandName, bool value) {
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var commands = serverPerms.Permissions.commands;
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
var commands = serverPerms.Permissions.Commands;
|
||||
if (commands.ContainsKey(commandName))
|
||||
commands[commandName] = value;
|
||||
else
|
||||
commands.Add(commandName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetChannelModulePermission(Channel channel, string moduleName, bool value) {
|
||||
var server = channel.Server;
|
||||
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id))
|
||||
serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name));
|
||||
|
||||
var modules = serverPerms.ChannelPermissions[channel.Id].modules;
|
||||
var modules = serverPerms.ChannelPermissions[channel.Id].Modules;
|
||||
|
||||
if (modules.ContainsKey(moduleName))
|
||||
modules[moduleName] = value;
|
||||
else
|
||||
modules.Add(moduleName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetChannelCommandPermission(Channel channel, string commandName, bool value) {
|
||||
var server = channel.Server;
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
if (!serverPerms.ChannelPermissions.ContainsKey(channel.Id))
|
||||
serverPerms.ChannelPermissions.Add(channel.Id, new Permissions(channel.Name));
|
||||
|
||||
var commands = serverPerms.ChannelPermissions[channel.Id].commands;
|
||||
var commands = serverPerms.ChannelPermissions[channel.Id].Commands;
|
||||
|
||||
if (commands.ContainsKey(commandName))
|
||||
commands[commandName] = value;
|
||||
else
|
||||
commands.Add(commandName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetRoleModulePermission(Role role, string moduleName, bool value) {
|
||||
var server = role.Server;
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
if (!serverPerms.RolePermissions.ContainsKey(role.Id))
|
||||
serverPerms.RolePermissions.Add(role.Id, new Permissions(role.Name));
|
||||
|
||||
var modules = serverPerms.RolePermissions[role.Id].modules;
|
||||
var modules = serverPerms.RolePermissions[role.Id].Modules;
|
||||
|
||||
if (modules.ContainsKey(moduleName))
|
||||
modules[moduleName] = value;
|
||||
else
|
||||
modules.Add(moduleName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetRoleCommandPermission(Role role, string commandName, bool value) {
|
||||
var server = role.Server;
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
if (!serverPerms.RolePermissions.ContainsKey(role.Id))
|
||||
serverPerms.RolePermissions.Add(role.Id, new Permissions(role.Name));
|
||||
|
||||
var commands = serverPerms.RolePermissions[role.Id].commands;
|
||||
var commands = serverPerms.RolePermissions[role.Id].Commands;
|
||||
|
||||
if (commands.ContainsKey(commandName))
|
||||
commands[commandName] = value;
|
||||
else
|
||||
commands.Add(commandName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetUserModulePermission(User user, string moduleName, bool value) {
|
||||
var server = user.Server;
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
|
||||
if (!serverPerms.UserPermissions.ContainsKey(user.Id))
|
||||
serverPerms.UserPermissions.Add(user.Id, new Permissions(user.Name));
|
||||
|
||||
var modules = serverPerms.UserPermissions[user.Id].modules;
|
||||
var modules = serverPerms.UserPermissions[user.Id].Modules;
|
||||
|
||||
if (modules.ContainsKey(moduleName))
|
||||
modules[moduleName] = value;
|
||||
else
|
||||
modules.Add(moduleName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
|
||||
public static void SetUserCommandPermission(User user, string commandName, bool value) {
|
||||
var server = user.Server;
|
||||
ServerPermissions serverPerms = _permissionsDict.GetOrAdd(server.Id,
|
||||
serverPerms = new ServerPermissions(server.Id, server.Name));
|
||||
var serverPerms = PermissionsDict.GetOrAdd(server.Id,
|
||||
new ServerPermissions(server.Id, server.Name));
|
||||
if (!serverPerms.UserPermissions.ContainsKey(user.Id))
|
||||
serverPerms.UserPermissions.Add(user.Id, new Permissions(user.Name));
|
||||
|
||||
var commands = serverPerms.UserPermissions[user.Id].commands;
|
||||
var commands = serverPerms.UserPermissions[user.Id].Commands;
|
||||
|
||||
if (commands.ContainsKey(commandName))
|
||||
commands[commandName] = value;
|
||||
else
|
||||
commands.Add(commandName, value);
|
||||
Task.Run(() => WriteServerToJson(server.Id));
|
||||
Task.Run(() => WriteServerToJson(serverPerms));
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
@ -312,33 +313,31 @@ namespace NadekoBot.Classes.Permissions {
|
||||
/// <summary>
|
||||
/// Module name with allowed/disallowed
|
||||
/// </summary>
|
||||
public Dictionary<string, bool> modules { get; set; }
|
||||
public Dictionary<string, bool> Modules { get; set; }
|
||||
/// <summary>
|
||||
/// Command name with allowed/disallowed
|
||||
/// </summary>
|
||||
public Dictionary<string, bool> commands { get; set; }
|
||||
public Dictionary<string, bool> Commands { get; set; }
|
||||
|
||||
public Permissions(string name) {
|
||||
Name = name;
|
||||
modules = new Dictionary<string, bool>();
|
||||
commands = new Dictionary<string, bool>();
|
||||
Modules = new Dictionary<string, bool>();
|
||||
Commands = new Dictionary<string, bool>();
|
||||
}
|
||||
|
||||
public override string ToString() {
|
||||
string toReturn = "";
|
||||
var bannedModules = modules.Where(kvp => kvp.Value == false);
|
||||
if (bannedModules.Count() > 0) {
|
||||
var toReturn = "";
|
||||
var bannedModules = Modules.Where(kvp => kvp.Value == false);
|
||||
var bannedModulesArray = bannedModules as KeyValuePair<string, bool>[] ?? bannedModules.ToArray();
|
||||
if (bannedModulesArray.Any()) {
|
||||
toReturn += "`Banned Modules:`\n";
|
||||
foreach (var m in bannedModules) {
|
||||
toReturn += $"\t`[x] {m.Key}`\n";
|
||||
}
|
||||
toReturn = bannedModulesArray.Aggregate(toReturn, (current, m) => current + $"\t`[x] {m.Key}`\n");
|
||||
}
|
||||
var bannedCommands = commands.Where(kvp => kvp.Value == false);
|
||||
if (bannedCommands.Count() > 0) {
|
||||
var bannedCommands = Commands.Where(kvp => kvp.Value == false);
|
||||
var bannedCommandsArr = bannedCommands as KeyValuePair<string, bool>[] ?? bannedCommands.ToArray();
|
||||
if (bannedCommandsArr.Any()) {
|
||||
toReturn += "`Banned Commands:`\n";
|
||||
foreach (var c in bannedCommands) {
|
||||
toReturn += $"\t`[x] {c.Key}`\n";
|
||||
}
|
||||
toReturn = bannedCommandsArr.Aggregate(toReturn, (current, c) => current + $"\t`[x] {c.Key}`\n");
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
@ -20,31 +20,30 @@ namespace NadekoBot.Classes {
|
||||
|
||||
public static class SearchHelper {
|
||||
private static DateTime lastRefreshed = DateTime.MinValue;
|
||||
private static string token = "";
|
||||
private static string token { get; set; } = "";
|
||||
|
||||
public static async Task<Stream> GetResponseStreamAsync(string url,
|
||||
IEnumerable<KeyValuePair<string, string>> headers = null, RequestHttpMethod method = RequestHttpMethod.Get) {
|
||||
if (string.IsNullOrWhiteSpace(url))
|
||||
throw new ArgumentNullException(nameof(url));
|
||||
using (var httpClient = new HttpClient()) {
|
||||
switch (method) {
|
||||
case RequestHttpMethod.Get:
|
||||
if (headers != null) {
|
||||
foreach (var header in headers) {
|
||||
httpClient.DefaultRequestHeaders.Add(header.Key, header.Value);
|
||||
}
|
||||
var httpClient = new HttpClient();
|
||||
switch (method) {
|
||||
case RequestHttpMethod.Get:
|
||||
if (headers != null) {
|
||||
foreach (var header in headers) {
|
||||
httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value);
|
||||
}
|
||||
return await httpClient.GetStreamAsync(url);
|
||||
case RequestHttpMethod.Post:
|
||||
FormUrlEncodedContent formContent = null;
|
||||
if (headers != null) {
|
||||
formContent = new FormUrlEncodedContent(headers);
|
||||
}
|
||||
var message = await httpClient.PostAsync(url, formContent);
|
||||
return await message.Content.ReadAsStreamAsync();
|
||||
default:
|
||||
throw new NotImplementedException("That type of request is unsupported.");
|
||||
}
|
||||
}
|
||||
return await httpClient.GetStreamAsync(url);
|
||||
case RequestHttpMethod.Post:
|
||||
FormUrlEncodedContent formContent = null;
|
||||
if (headers != null) {
|
||||
formContent = new FormUrlEncodedContent(headers);
|
||||
}
|
||||
var message = await httpClient.PostAsync(url, formContent);
|
||||
return await message.Content.ReadAsStreamAsync();
|
||||
default:
|
||||
throw new NotImplementedException("That type of request is unsupported.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,13 +63,19 @@ namespace NadekoBot.Classes {
|
||||
await RefreshAnilistToken();
|
||||
|
||||
var link = "http://anilist.co/api/anime/search/" + Uri.EscapeUriString(query);
|
||||
try {
|
||||
var headers = new Dictionary<string, string> {{"'access_token'", "'"+token+"'"}};
|
||||
var smallContent = await GetResponseStringAsync(link, headers);
|
||||
var smallObj = JArray.Parse(smallContent)[0];
|
||||
var content = await GetResponseStringAsync("http://anilist.co/api/anime/" + smallObj["id"], headers);
|
||||
|
||||
var headers = new Dictionary<string, string> { { "access_token", token } };
|
||||
var smallContent = await GetResponseStringAsync(link, headers);
|
||||
var smallObj = JArray.Parse(smallContent)[0];
|
||||
var content = await GetResponseStringAsync("http://anilist.co/api/anime/" + smallObj["id"], headers);
|
||||
return await Task.Run(() => JsonConvert.DeserializeObject<AnimeResult>(content));
|
||||
|
||||
return await Task.Run(() => JsonConvert.DeserializeObject<AnimeResult>(content));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
Console.WriteLine(ex);
|
||||
return new AnimeResult();
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task<MangaResult> GetMangaQueryResultLink(string query) {
|
||||
@ -90,6 +95,11 @@ namespace NadekoBot.Classes {
|
||||
}
|
||||
|
||||
private static async Task RefreshAnilistToken() {
|
||||
if (DateTime.Now - lastRefreshed > TimeSpan.FromMinutes(29))
|
||||
lastRefreshed=DateTime.Now;
|
||||
else {
|
||||
return;
|
||||
}
|
||||
var headers = new Dictionary<string, string> {
|
||||
{"grant_type", "client_credentials"},
|
||||
{"client_id", "kwoth-w0ki9"},
|
||||
|
@ -5,6 +5,7 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Discord.Commands;
|
||||
using System.Drawing;
|
||||
using NadekoBot.Classes;
|
||||
using NadekoBot.Extensions;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
@ -22,7 +23,7 @@ namespace NadekoBot.Commands {
|
||||
|
||||
|
||||
private System.Timers.Timer clearTimer { get; } = new System.Timers.Timer();
|
||||
public LoLCommands() {
|
||||
public LoLCommands() {
|
||||
clearTimer.Interval = new TimeSpan(0, 10, 0).TotalMilliseconds;
|
||||
clearTimer.Start();
|
||||
clearTimer.Elapsed += (s, e) => {
|
||||
@ -31,17 +32,16 @@ namespace NadekoBot.Commands {
|
||||
CachedChampionImages = CachedChampionImages
|
||||
.Where(kvp => DateTime.Now - kvp.Value.AddedAt > new TimeSpan(1, 0, 0))
|
||||
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
|
||||
}
|
||||
catch { }
|
||||
} catch { }
|
||||
};
|
||||
}
|
||||
|
||||
private string[] trashTalk = new[] { "Better ban your counters. You are going to carry the game anyway.",
|
||||
"Go with the flow. Don't think. Just ban one of these.",
|
||||
"DONT READ BELOW! Ban Urgot mid OP 100%. Im smurf Diamond 1.",
|
||||
"Ask your teammates what would they like to play, and ban that.",
|
||||
"If you consider playing teemo, do it. If you consider teemo, you deserve him.",
|
||||
"Doesn't matter what you ban really. Enemy will ban your main and you will lose." };
|
||||
private readonly string[] trashTalk = { "Better ban your counters. You are going to carry the game anyway.",
|
||||
"Go with the flow. Don't think. Just ban one of these.",
|
||||
"DONT READ BELOW! Ban Urgot mid OP 100%. Im smurf Diamond 1.",
|
||||
"Ask your teammates what would they like to play, and ban that.",
|
||||
"If you consider playing teemo, do it. If you consider teemo, you deserve him.",
|
||||
"Doesn't matter what you ban really. Enemy will ban your main and you will lose." };
|
||||
|
||||
public override Func<CommandEventArgs, Task> DoFunc() {
|
||||
throw new NotImplementedException();
|
||||
@ -63,15 +63,14 @@ namespace NadekoBot.Commands {
|
||||
.Do(async e => {
|
||||
try {
|
||||
//get role
|
||||
string role = ResolvePos(e.GetArg("position"));
|
||||
string resolvedRole = role;
|
||||
var role = ResolvePos(e.GetArg("position"));
|
||||
var resolvedRole = role;
|
||||
var name = e.GetArg("champ").Replace(" ", "");
|
||||
CachedChampion champ = null;
|
||||
lock (cacheLock) {
|
||||
CachedChampionImages.TryGetValue(name + "_" + resolvedRole, out champ);
|
||||
}
|
||||
if (champ != null) {
|
||||
Console.WriteLine("Sending lol image from cache.");
|
||||
champ.ImageStream.Position = 0;
|
||||
await e.Channel.SendFile("champ.png", champ.ImageStream);
|
||||
return;
|
||||
@ -79,7 +78,7 @@ namespace NadekoBot.Commands {
|
||||
var allData = JArray.Parse(await Classes.SearchHelper.GetResponseStringAsync($"http://api.champion.gg/champion/{name}?api_key={NadekoBot.Creds.LOLAPIKey}"));
|
||||
JToken data = null;
|
||||
if (role != null) {
|
||||
for (int i = 0; i < allData.Count; i++) {
|
||||
for (var i = 0; i < allData.Count; i++) {
|
||||
if (allData[i]["role"].ToString().Equals(role)) {
|
||||
data = allData[i];
|
||||
break;
|
||||
@ -89,8 +88,7 @@ namespace NadekoBot.Commands {
|
||||
await e.Channel.SendMessage("💢 Data for that role does not exist.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
data = allData[0];
|
||||
role = allData[0]["role"].ToString();
|
||||
resolvedRole = ResolvePos(role);
|
||||
@ -107,14 +105,14 @@ namespace NadekoBot.Commands {
|
||||
//name = data["title"].ToString();
|
||||
// get all possible roles, and "select" the shown one
|
||||
var roles = new string[allData.Count];
|
||||
for (int i = 0; i < allData.Count; i++) {
|
||||
for (var i = 0; i < allData.Count; i++) {
|
||||
roles[i] = allData[i]["role"].ToString();
|
||||
if (roles[i] == role)
|
||||
roles[i] = ">" + roles[i] + "<";
|
||||
}
|
||||
var general = JArray.Parse(await Classes.SearchHelper.GetResponseStringAsync($"http://api.champion.gg/stats/champs/{name}?api_key={NadekoBot.Creds.LOLAPIKey}"))
|
||||
.Where(jt => jt["role"].ToString() == role)
|
||||
.FirstOrDefault()?["general"];
|
||||
var general = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.champion.gg/stats/" +
|
||||
$"champs/{name}?api_key={NadekoBot.Creds.LOLAPIKey}"))
|
||||
.FirstOrDefault(jt => jt["role"].ToString() == role)?["general"];
|
||||
if (general == null) {
|
||||
Console.WriteLine("General is null.");
|
||||
return;
|
||||
@ -122,7 +120,7 @@ namespace NadekoBot.Commands {
|
||||
//get build data for this role
|
||||
var buildData = data["items"]["mostGames"]["items"];
|
||||
var items = new string[6];
|
||||
for (int i = 0; i < 6; i++) {
|
||||
for (var i = 0; i < 6; i++) {
|
||||
items[i] = buildData[i]["id"].ToString();
|
||||
}
|
||||
|
||||
@ -147,13 +145,12 @@ namespace NadekoBot.Commands {
|
||||
var orderArr = (data["skills"]["mostGames"]["order"] as JArray);
|
||||
|
||||
//todo save this for at least 1 hour
|
||||
Image img = Image.FromFile("data/lol/bg.png");
|
||||
using (Graphics g = Graphics.FromImage(img)) {
|
||||
var img = Image.FromFile("data/lol/bg.png");
|
||||
using (var g = Graphics.FromImage(img)) {
|
||||
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
|
||||
//g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
|
||||
int statsFontSize = 15;
|
||||
int margin = 5;
|
||||
int imageSize = 75;
|
||||
const int margin = 5;
|
||||
const int imageSize = 75;
|
||||
var normalFont = new Font("Monaco", 8, FontStyle.Regular);
|
||||
var smallFont = new Font("Monaco", 7, FontStyle.Regular);
|
||||
//draw champ image
|
||||
@ -168,18 +165,26 @@ namespace NadekoBot.Commands {
|
||||
//todo
|
||||
//draw skill order
|
||||
float orderFormula = 120 / orderArr.Count;
|
||||
float orderVerticalSpacing = 10;
|
||||
for (int i = 0; i < orderArr.Count; i++) {
|
||||
float orderX = margin + margin + imageSize + orderFormula * i + i;
|
||||
const float orderVerticalSpacing = 10;
|
||||
for (var i = 0; i < orderArr.Count; i++) {
|
||||
var orderX = margin + margin + imageSize + orderFormula * i + i;
|
||||
float orderY = margin + 35;
|
||||
string spellName = orderArr[i].ToString().ToLowerInvariant();
|
||||
var spellName = orderArr[i].ToString().ToLowerInvariant();
|
||||
|
||||
if (spellName == "w")
|
||||
orderY += orderVerticalSpacing;
|
||||
else if (spellName == "e")
|
||||
orderY += orderVerticalSpacing * 2;
|
||||
else if (spellName == "r")
|
||||
orderY += orderVerticalSpacing * 3;
|
||||
switch (spellName) {
|
||||
case "w":
|
||||
orderY += orderVerticalSpacing;
|
||||
break;
|
||||
case "e":
|
||||
orderY += orderVerticalSpacing * 2;
|
||||
break;
|
||||
case "r":
|
||||
orderY += orderVerticalSpacing * 3;
|
||||
break;
|
||||
default:
|
||||
orderY += orderVerticalSpacing * 3;
|
||||
break;
|
||||
}
|
||||
|
||||
g.DrawString(spellName.ToUpperInvariant(), new Font("Monaco", 7), Brushes.LimeGreen, orderX, orderY);
|
||||
}
|
||||
@ -200,9 +205,9 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
g.DrawString($"{runes}", smallFont, Brushes.WhiteSmoke, margin, margin + imageSize + margin + 40);
|
||||
//draw counters
|
||||
g.DrawString($"Best against", smallFont, Brushes.WhiteSmoke, margin, img.Height - imageSize + margin);
|
||||
int smallImgSize = 50;
|
||||
var smallImgSize = 50;
|
||||
|
||||
for (int i = 0; i < counters.Length; i++) {
|
||||
for (var i = 0; i < counters.Length; i++) {
|
||||
g.DrawImage(GetImage(counters[i]),
|
||||
new Rectangle(i * (smallImgSize + margin) + margin, img.Height - smallImgSize - margin,
|
||||
smallImgSize,
|
||||
@ -211,8 +216,8 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
//draw countered by
|
||||
g.DrawString($"Worst against", smallFont, Brushes.WhiteSmoke, img.Width - 3 * (smallImgSize + margin), img.Height - imageSize + margin);
|
||||
|
||||
for (int i = 0; i < countered.Length; i++) {
|
||||
int j = countered.Length - i;
|
||||
for (var i = 0; i < countered.Length; i++) {
|
||||
var j = countered.Length - i;
|
||||
g.DrawImage(GetImage(countered[i]),
|
||||
new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), img.Height - smallImgSize - margin,
|
||||
smallImgSize,
|
||||
@ -221,10 +226,10 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
//draw item build
|
||||
g.DrawString("Popular build", normalFont, Brushes.WhiteSmoke, img.Width - (3 * (smallImgSize + margin) + margin), 77);
|
||||
|
||||
for (int i = 0; i < 6; i++) {
|
||||
var inverse_i = 5 - i;
|
||||
var j = inverse_i % 3 + 1;
|
||||
var k = inverse_i / 3;
|
||||
for (var i = 0; i < 6; i++) {
|
||||
var inverseI = 5 - i;
|
||||
var j = inverseI % 3 + 1;
|
||||
var k = inverseI / 3;
|
||||
g.DrawImage(GetImage(items[i], GetImageType.Item),
|
||||
new Rectangle(img.Width - (j * (smallImgSize + margin) + margin), 92 + k * (smallImgSize + margin),
|
||||
smallImgSize,
|
||||
@ -234,10 +239,8 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
var cachedChamp = new CachedChampion { AddedAt = DateTime.Now, ImageStream = img.ToStream(System.Drawing.Imaging.ImageFormat.Png), Name = name.ToLower() + "_" + resolvedRole };
|
||||
CachedChampionImages.Add(cachedChamp.Name, cachedChamp);
|
||||
await e.Channel.SendFile(data["title"] + "_stats.png", cachedChamp.ImageStream);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
} catch {
|
||||
await e.Channel.SendMessage("💢 Failed retreiving data for that champion.");
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
@ -245,7 +248,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
.Description("Shows top 6 banned champions ordered by ban rate. Ban these champions and you will be Plat 5 in no time.")
|
||||
.Do(async e => {
|
||||
|
||||
int showCount = 6;
|
||||
var showCount = 6;
|
||||
//http://api.champion.gg/stats/champs/mostBanned?api_key=YOUR_API_TOKEN&page=1&limit=2
|
||||
try {
|
||||
var data = JObject.Parse(
|
||||
@ -253,10 +256,10 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
.SearchHelper
|
||||
.GetResponseStringAsync($"http://api.champion.gg/stats/champs/mostBanned?api_key={NadekoBot.Creds.LOLAPIKey}&page=1&limit={showCount}"))["data"] as JArray;
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sb = new StringBuilder();
|
||||
sb.AppendLine($"**Showing {showCount} top banned champions.**");
|
||||
sb.AppendLine($"`{trashTalk[new Random().Next(0, trashTalk.Length)]}`");
|
||||
for (int i = 0; i < data.Count; i++) {
|
||||
for (var i = 0; i < data.Count; i++) {
|
||||
if (i % 2 == 0 && i != 0)
|
||||
sb.AppendLine();
|
||||
sb.Append($"`{i + 1}.` **{data[i]["name"]}** ");
|
||||
@ -264,8 +267,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
}
|
||||
|
||||
await e.Channel.SendMessage(sb.ToString());
|
||||
}
|
||||
catch (Exception ex) {
|
||||
} catch (Exception ex) {
|
||||
await e.Channel.SendMessage($"Fail:\n{ex}");
|
||||
}
|
||||
});
|
||||
@ -275,7 +277,7 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
Champion,
|
||||
Item
|
||||
}
|
||||
private Image GetImage(string id, GetImageType imageType = GetImageType.Champion) {
|
||||
private static Image GetImage(string id, GetImageType imageType = GetImageType.Champion) {
|
||||
try {
|
||||
switch (imageType) {
|
||||
case GetImageType.Champion:
|
||||
@ -284,13 +286,12 @@ Assists: {general["assists"]} Ban: {general["banRate"]}%
|
||||
default:
|
||||
return Image.FromFile($"data/lol/items/{id}.png");
|
||||
}
|
||||
}
|
||||
catch (Exception) {
|
||||
} catch (Exception) {
|
||||
return Image.FromFile("data/lol/_ERROR.png");
|
||||
}
|
||||
}
|
||||
|
||||
private string ResolvePos(string pos) {
|
||||
private static string ResolvePos(string pos) {
|
||||
if (string.IsNullOrWhiteSpace(pos))
|
||||
return null;
|
||||
switch (pos.ToLowerInvariant()) {
|
||||
|
@ -5,55 +5,58 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Discord.Commands;
|
||||
using System.Timers;
|
||||
using NadekoBot.Modules;
|
||||
|
||||
namespace NadekoBot.Commands {
|
||||
internal class PlayingRotate : DiscordCommand {
|
||||
|
||||
private static List<string> rotatingStatuses = new List<string>();
|
||||
private static Timer timer = new Timer(12000);
|
||||
private static readonly Timer timer = new Timer(12000);
|
||||
|
||||
private Dictionary<string, Func<string>> playingPlaceholders => new Dictionary<string, Func<string>> {
|
||||
{"%servers%", ()=> NadekoBot.Client.Servers.Count().ToString() },
|
||||
{"%users%", () => NadekoBot.Client.Servers.SelectMany(s=>s.Users).Count().ToString() },
|
||||
{"%playing%", () => {
|
||||
var cnt = Modules.Music.musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count();
|
||||
if(cnt == 1) {
|
||||
public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
|
||||
new Dictionary<string, Func<string>> {
|
||||
{"%servers%", () => NadekoBot.Client.Servers.Count().ToString()},
|
||||
{"%users%", () => NadekoBot.Client.Servers.SelectMany(s => s.Users).Count().ToString()}, {
|
||||
"%playing%", () => {
|
||||
var cnt = Music.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
|
||||
if (cnt != 1) return cnt.ToString();
|
||||
try {
|
||||
var mp = Modules.Music.musicPlayers.FirstOrDefault();
|
||||
var mp = Music.MusicPlayers.FirstOrDefault();
|
||||
return mp.Value.CurrentSong.SongInfo.Title;
|
||||
} catch { }
|
||||
}
|
||||
catch {
|
||||
return "No songs";
|
||||
}
|
||||
}
|
||||
return cnt.ToString();
|
||||
}
|
||||
},
|
||||
{"%queued%", () => Modules.Music.musicPlayers.Sum(kvp=>kvp.Value.Playlist.Count).ToString() },
|
||||
{"%trivia%", () => Commands.Trivia.runningTrivias.Count.ToString() }
|
||||
};
|
||||
private object playingPlaceholderLock => new object();
|
||||
},
|
||||
{"%queued%", () => Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()},
|
||||
{"%trivia%", () => Trivia.runningTrivias.Count.ToString()}
|
||||
};
|
||||
|
||||
private readonly object playingPlaceholderLock = new object();
|
||||
|
||||
public PlayingRotate() {
|
||||
int i = -1;
|
||||
var i = -1;
|
||||
timer.Elapsed += (s, e) => {
|
||||
try {
|
||||
i++;
|
||||
string status = "";
|
||||
var status = "";
|
||||
lock (playingPlaceholderLock) {
|
||||
if (playingPlaceholders.Count == 0)
|
||||
if (PlayingPlaceholders.Count == 0)
|
||||
return;
|
||||
if (i >= playingPlaceholders.Count) {
|
||||
if (i >= PlayingPlaceholders.Count) {
|
||||
i = -1;
|
||||
return;
|
||||
}
|
||||
status = rotatingStatuses[i];
|
||||
foreach (var kvp in playingPlaceholders) {
|
||||
status = status.Replace(kvp.Key, kvp.Value());
|
||||
}
|
||||
status = PlayingPlaceholders.Aggregate(status,
|
||||
(current, kvp) => current.Replace(kvp.Key, kvp.Value()));
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(status))
|
||||
return;
|
||||
Task.Run(() => { try { NadekoBot.Client.SetGame(status); } catch { } });
|
||||
Task.Run(() => { NadekoBot.Client.SetGame(status); });
|
||||
}
|
||||
catch { }
|
||||
catch {}
|
||||
};
|
||||
}
|
||||
|
||||
@ -74,7 +77,8 @@ namespace NadekoBot.Commands {
|
||||
|
||||
cgb.CreateCommand(".addplaying")
|
||||
.Alias(".adpl")
|
||||
.Description("Adds a specified string to the list of playing strings to rotate. Supported placeholders: " + string.Join(", ", playingPlaceholders.Keys))
|
||||
.Description("Adds a specified string to the list of playing strings to rotate. " +
|
||||
"Supported placeholders: " + string.Join(", ", PlayingPlaceholders.Keys))
|
||||
.Parameter("text", ParameterType.Unparsed)
|
||||
.AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
|
||||
.Do(async e => {
|
||||
@ -93,31 +97,32 @@ namespace NadekoBot.Commands {
|
||||
.AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
|
||||
.Do(async e => {
|
||||
if (rotatingStatuses.Count == 0)
|
||||
await e.Channel.SendMessage("`There are no playing strings. Add some with .addplaying [text] command.`");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < rotatingStatuses.Count; i++) {
|
||||
await e.Channel.SendMessage("`There are no playing strings. " +
|
||||
"Add some with .addplaying [text] command.`");
|
||||
var sb = new StringBuilder();
|
||||
for (var i = 0; i < rotatingStatuses.Count; i++) {
|
||||
sb.AppendLine($"`{i + 1}.` {rotatingStatuses[i]}");
|
||||
}
|
||||
await e.Channel.SendMessage(sb.ToString());
|
||||
});
|
||||
|
||||
cgb.CreateCommand(".removeplaying")
|
||||
.Alias(".repl")
|
||||
.Description("Removes a playing string on a given number.")
|
||||
.Parameter("number", ParameterType.Required)
|
||||
.AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("number");
|
||||
int num;
|
||||
string str;
|
||||
lock (playingPlaceholderLock) {
|
||||
if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > rotatingStatuses.Count)
|
||||
return;
|
||||
str = rotatingStatuses[num - 1];
|
||||
rotatingStatuses.RemoveAt(num - 1);
|
||||
}
|
||||
await e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})");
|
||||
});
|
||||
.Alias(".repl", ".rmpl")
|
||||
.Description("Removes a playing string on a given number.")
|
||||
.Parameter("number", ParameterType.Required)
|
||||
.AddCheck(Classes.Permissions.SimpleCheckers.OwnerOnly())
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("number");
|
||||
int num;
|
||||
string str;
|
||||
lock (playingPlaceholderLock) {
|
||||
if (!int.TryParse(arg.Trim(), out num) || num <= 0 || num > rotatingStatuses.Count)
|
||||
return;
|
||||
str = rotatingStatuses[num - 1];
|
||||
rotatingStatuses.RemoveAt(num - 1);
|
||||
}
|
||||
await e.Channel.SendMessage($"🆗 `Removed playing string #{num}`({str})");
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,19 +20,24 @@ namespace NadekoBot.Commands {
|
||||
cgb.CreateCommand(">poll")
|
||||
.Description("Creates a poll, only person who has manage server permission can do it.\n**Usage**: >poll Question?;Answer1;Answ 2;A_3")
|
||||
.Parameter("allargs", ParameterType.Unparsed)
|
||||
.Do(e => {
|
||||
if (!e.User.ServerPermissions.ManageChannels)
|
||||
return;
|
||||
if (ActivePolls.ContainsKey(e.Server))
|
||||
return;
|
||||
var arg = e.GetArg("allargs");
|
||||
if (string.IsNullOrWhiteSpace(arg) || !arg.Contains(";"))
|
||||
return;
|
||||
var data = arg.Split(';');
|
||||
if (data.Length < 3)
|
||||
return;
|
||||
.Do(async e => {
|
||||
await Task.Run(async () => {
|
||||
if (!e.User.ServerPermissions.ManageChannels)
|
||||
return;
|
||||
if (ActivePolls.ContainsKey(e.Server))
|
||||
return;
|
||||
var arg = e.GetArg("allargs");
|
||||
if (string.IsNullOrWhiteSpace(arg) || !arg.Contains(";"))
|
||||
return;
|
||||
var data = arg.Split(';');
|
||||
if (data.Length < 3)
|
||||
return;
|
||||
|
||||
new Poll(e, data[0], data.Skip(1));
|
||||
var poll = new Poll(e, data[0], data.Skip(1));
|
||||
if (PollCommand.ActivePolls.TryAdd(e.Server, poll)) {
|
||||
await poll.StartPoll();
|
||||
}
|
||||
});
|
||||
});
|
||||
cgb.CreateCommand(">pollend")
|
||||
.Description("Stops active poll on this server and prints the results in this channel.")
|
||||
@ -47,33 +52,27 @@ namespace NadekoBot.Commands {
|
||||
}
|
||||
|
||||
internal class Poll {
|
||||
private CommandEventArgs e;
|
||||
private string[] answers;
|
||||
private readonly CommandEventArgs e;
|
||||
private readonly string[] answers;
|
||||
private ConcurrentDictionary<User, int> participants = new ConcurrentDictionary<User, int>();
|
||||
private string question;
|
||||
private readonly string question;
|
||||
private DateTime started;
|
||||
private CancellationTokenSource pollCancellationSource = new CancellationTokenSource();
|
||||
|
||||
public Poll(CommandEventArgs e, string v, IEnumerable<string> enumerable) {
|
||||
public Poll(CommandEventArgs e, string question, IEnumerable<string> enumerable) {
|
||||
this.e = e;
|
||||
this.question = v;
|
||||
this.answers = enumerable.ToArray();
|
||||
|
||||
if (PollCommand.ActivePolls.TryAdd(e.Server, this)) {
|
||||
Task.Factory.StartNew(async () => await StartPoll());
|
||||
}
|
||||
this.question = question;
|
||||
this.answers = enumerable as string[] ?? enumerable.ToArray();
|
||||
}
|
||||
|
||||
private async Task StartPoll() {
|
||||
public async Task StartPoll() {
|
||||
started = DateTime.Now;
|
||||
NadekoBot.Client.MessageReceived += Vote;
|
||||
var msgToSend =
|
||||
$"📃**{e.User.Name}** from **{e.Server.Name}** server has created a poll which requires your attention:\n\n" +
|
||||
$"**{question}**\n";
|
||||
int num = 1;
|
||||
foreach (var answ in answers) {
|
||||
msgToSend += $"`{num++}.` **{answ}**\n";
|
||||
}
|
||||
var num = 1;
|
||||
msgToSend = answers.Aggregate(msgToSend, (current, answ) => current + $"`{num++}.` **{answ}**\n");
|
||||
msgToSend += "\n**Private Message me with the corresponding number of the answer.**";
|
||||
await e.Channel.SendMessage(msgToSend);
|
||||
}
|
||||
@ -87,16 +86,16 @@ namespace NadekoBot.Commands {
|
||||
.ToDictionary(x => x.Key, x => x.Sum(kvp => 1))
|
||||
.OrderBy(kvp => kvp.Value);
|
||||
|
||||
int totalVotesCast = results.Sum(kvp => kvp.Value);
|
||||
var totalVotesCast = results.Sum(kvp => kvp.Value);
|
||||
if (totalVotesCast == 0) {
|
||||
await ch.SendMessage("📄 **No votes have been cast.**");
|
||||
return;
|
||||
}
|
||||
var closeMessage = $"--------------**POLL CLOSED**--------------\n" +
|
||||
$"📄 , here are the results:\n";
|
||||
foreach (var kvp in results) {
|
||||
closeMessage += $"`{kvp.Key}.` **[{answers[kvp.Key - 1]}]** has {kvp.Value} votes.({kvp.Value * 1.0f / totalVotesCast * 100}%)\n";
|
||||
}
|
||||
closeMessage = results.Aggregate(closeMessage, (current, kvp) => current + $"`{kvp.Key}.` **[{answers[kvp.Key - 1]}]**" +
|
||||
$" has {kvp.Value} votes." +
|
||||
$"({kvp.Value*1.0f/totalVotesCast*100}%)\n");
|
||||
|
||||
await ch.SendMessage($"📄 **Total votes cast**: {totalVotesCast}\n{closeMessage}");
|
||||
} catch (Exception ex) {
|
||||
@ -112,12 +111,11 @@ namespace NadekoBot.Commands {
|
||||
return;
|
||||
|
||||
int vote;
|
||||
if (int.TryParse(e.Message.Text, out vote)) {
|
||||
if (vote < 1 || vote > answers.Length)
|
||||
return;
|
||||
if (participants.TryAdd(e.User, vote)) {
|
||||
await e.User.SendMessage($"Thanks for voting **{e.User.Name}**.");
|
||||
}
|
||||
if (!int.TryParse(e.Message.Text, out vote)) return;
|
||||
if (vote < 1 || vote > answers.Length)
|
||||
return;
|
||||
if (participants.TryAdd(e.User, vote)) {
|
||||
await e.User.SendMessage($"Thanks for voting **{e.User.Name}**.");
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
@ -17,7 +17,7 @@ using NadekoBot.Commands;
|
||||
namespace NadekoBot.Modules {
|
||||
internal class Conversations : DiscordModule {
|
||||
private string firestr = "🔥 ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้ 🔥";
|
||||
public Conversations() {
|
||||
public Conversations() {
|
||||
commands.Add(new CopyCommand());
|
||||
commands.Add(new RequestsCommand());
|
||||
}
|
||||
@ -221,7 +221,8 @@ namespace NadekoBot.Modules {
|
||||
.Do(async e => {
|
||||
var count = 1;
|
||||
int.TryParse(e.Args[0], out count);
|
||||
|
||||
if (count == 0)
|
||||
count = 1;
|
||||
if (count < 1 || count > 12) {
|
||||
await e.Channel.SendMessage("Number must be between 0 and 12");
|
||||
return;
|
||||
@ -257,8 +258,7 @@ namespace NadekoBot.Modules {
|
||||
if (invite != null) {
|
||||
try {
|
||||
await invite.Accept();
|
||||
}
|
||||
catch {
|
||||
} catch {
|
||||
await e.Channel.SendMessage("Failed to accept invite.");
|
||||
}
|
||||
await e.Channel.SendMessage("I got in!");
|
||||
|
@ -13,10 +13,10 @@ using Timer = System.Timers.Timer;
|
||||
namespace NadekoBot.Modules {
|
||||
internal class Music : DiscordModule {
|
||||
|
||||
public static ConcurrentDictionary<Server, MusicPlayer> musicPlayers = new ConcurrentDictionary<Server, MusicPlayer>();
|
||||
public static ConcurrentDictionary<ulong, float> defaultMusicVolumes = new ConcurrentDictionary<ulong, float>();
|
||||
public static ConcurrentDictionary<Server, MusicPlayer> MusicPlayers = new ConcurrentDictionary<Server, MusicPlayer>();
|
||||
public static ConcurrentDictionary<ulong, float> DefaultMusicVolumes = new ConcurrentDictionary<ulong, float>();
|
||||
|
||||
private Timer setgameTimer => new Timer();
|
||||
private readonly Timer setgameTimer = new Timer();
|
||||
|
||||
private bool setgameEnabled = false;
|
||||
|
||||
@ -25,8 +25,8 @@ namespace NadekoBot.Modules {
|
||||
setgameTimer.Interval = 20000;
|
||||
setgameTimer.Elapsed += (s, e) => {
|
||||
try {
|
||||
int num = musicPlayers.Where(kvp => kvp.Value.CurrentSong != null).Count();
|
||||
NadekoBot.Client.SetGame($"{num} songs".SnPl(num) + $", {musicPlayers.Sum(kvp => kvp.Value.Playlist.Count())} queued");
|
||||
var num = MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
|
||||
NadekoBot.Client.SetGame($"{num} songs".SnPl(num) + $", {MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count())} queued");
|
||||
} catch { }
|
||||
};
|
||||
|
||||
@ -46,7 +46,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Goes to the next song in the queue.")
|
||||
.Do(e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
musicPlayer.Next();
|
||||
});
|
||||
|
||||
@ -55,7 +55,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Completely stops the music, unbinds the bot from the channel, and cleans up files.")
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
musicPlayer.Stop();
|
||||
var msg = await e.Channel.SendMessage("⚠Due to music issues, NadekoBot is unable to leave voice channels at this moment.\nIf this presents inconvenience, you can use `!m mv` command to make her join your current voice channel.");
|
||||
await Task.Delay(5000);
|
||||
@ -69,7 +69,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Pauses or Unpauses the song.")
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) return;
|
||||
musicPlayer.TogglePause();
|
||||
if (musicPlayer.Paused)
|
||||
await e.Channel.SendMessage("🎵`Music musicPlayer paused.`");
|
||||
@ -90,11 +90,11 @@ namespace NadekoBot.Modules {
|
||||
.Description("Lists up to 15 currently queued songs.")
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) {
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) {
|
||||
await e.Channel.SendMessage("🎵 No active music musicPlayer.");
|
||||
return;
|
||||
}
|
||||
string toSend = "🎵 **" + musicPlayer.Playlist.Count + "** `videos currently queued.` ";
|
||||
string toSend = "🎵 **" + musicPlayer.Playlist.Count + "** `tracks currently queued.` ";
|
||||
if (musicPlayer.Playlist.Count >= MusicPlayer.MaximumPlaylistSize)
|
||||
toSend += "**Song queue is full!**\n";
|
||||
else
|
||||
@ -108,7 +108,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Shows the song currently playing.")
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
await e.Channel.SendMessage($"🎵`Now Playing` {musicPlayer.CurrentSong.PrettyName}");
|
||||
});
|
||||
@ -118,7 +118,7 @@ namespace NadekoBot.Modules {
|
||||
.Parameter("val", ParameterType.Required)
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
var arg = e.GetArg("val");
|
||||
int volume;
|
||||
@ -141,7 +141,7 @@ namespace NadekoBot.Modules {
|
||||
await e.Channel.SendMessage("Volume number invalid.");
|
||||
return;
|
||||
}
|
||||
defaultMusicVolumes.AddOrUpdate(e.Server.Id, volume / 100, (key, newval) => volume / 100);
|
||||
DefaultMusicVolumes.AddOrUpdate(e.Server.Id, volume / 100, (key, newval) => volume / 100);
|
||||
await e.Channel.SendMessage($"🎵 `Default volume set to {volume}%`");
|
||||
});
|
||||
|
||||
@ -149,7 +149,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets the music volume to 0%")
|
||||
.Do(e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
musicPlayer.SetVolume(0);
|
||||
});
|
||||
@ -158,7 +158,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets the music volume to 100% (real max is actually 150%).")
|
||||
.Do(e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
musicPlayer.SetVolume(100);
|
||||
});
|
||||
@ -167,7 +167,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets the music volume to 50%.")
|
||||
.Do(e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
musicPlayer.SetVolume(50);
|
||||
});
|
||||
@ -176,7 +176,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Shuffles the current playlist.")
|
||||
.Do(async e => {
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
if (musicPlayer.Playlist.Count < 2) {
|
||||
await e.Channel.SendMessage("💢 Not enough songs in order to perform the shuffle.");
|
||||
@ -266,7 +266,7 @@ namespace NadekoBot.Modules {
|
||||
.Do(e => {
|
||||
MusicPlayer musicPlayer;
|
||||
var voiceChannel = e.User.VoiceChannel;
|
||||
if (voiceChannel == null || voiceChannel.Server != e.Server || !musicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
if (voiceChannel == null || voiceChannel.Server != e.Server || !MusicPlayers.TryGetValue(e.Server, out musicPlayer))
|
||||
return;
|
||||
musicPlayer.MoveToVoiceChannel(voiceChannel);
|
||||
});
|
||||
@ -277,7 +277,7 @@ namespace NadekoBot.Modules {
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("num");
|
||||
MusicPlayer musicPlayer;
|
||||
if (!musicPlayers.TryGetValue(e.Server, out musicPlayer)) {
|
||||
if (!MusicPlayers.TryGetValue(e.Server, out musicPlayer)) {
|
||||
return;
|
||||
}
|
||||
if (arg?.ToLower() == "all") {
|
||||
@ -306,39 +306,40 @@ namespace NadekoBot.Modules {
|
||||
});
|
||||
}
|
||||
|
||||
private async Task QueueSong(Channel TextCh, Channel VoiceCh, string query, bool silent = false, MusicType musicType = MusicType.Normal) {
|
||||
if (VoiceCh == null || VoiceCh.Server != TextCh.Server) {
|
||||
private async Task QueueSong(Channel textCh, Channel voiceCh, string query, bool silent = false, MusicType musicType = MusicType.Normal) {
|
||||
if (voiceCh == null || voiceCh.Server != textCh.Server) {
|
||||
if (!silent)
|
||||
await TextCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining.");
|
||||
throw new ArgumentNullException(nameof(VoiceCh));
|
||||
await textCh.SendMessage("💢 You need to be in a voice channel on this server.\n If you are already in a voice channel, try rejoining.");
|
||||
throw new ArgumentNullException(nameof(voiceCh));
|
||||
}
|
||||
if (string.IsNullOrWhiteSpace(query) || query.Length < 3)
|
||||
throw new ArgumentException("💢 Invalid query for queue song.", nameof(query));
|
||||
MusicPlayer musicPlayer = null;
|
||||
if (!musicPlayers.TryGetValue(TextCh.Server, out musicPlayer)) {
|
||||
if (!MusicPlayers.TryGetValue(textCh.Server, out musicPlayer)) {
|
||||
float? vol = null;
|
||||
float throwAway;
|
||||
if (defaultMusicVolumes.TryGetValue(TextCh.Server.Id, out throwAway))
|
||||
if (DefaultMusicVolumes.TryGetValue(textCh.Server.Id, out throwAway))
|
||||
vol = throwAway;
|
||||
musicPlayer = new MusicPlayer(VoiceCh, vol) {
|
||||
OnCompleted = async (song) => {
|
||||
musicPlayer = new MusicPlayer(voiceCh, vol) {
|
||||
OnCompleted = async song => {
|
||||
try {
|
||||
await TextCh.SendMessage($"🎵`Finished`{song.PrettyName}");
|
||||
} catch { }
|
||||
await textCh.SendMessage($"🎵`Finished`{song.PrettyName}");
|
||||
}
|
||||
catch {}
|
||||
},
|
||||
OnStarted = async (song) => {
|
||||
try {
|
||||
var msgTxt = $"🎵`Playing`{song.PrettyName} `Vol: {(int)(musicPlayer.Volume * 100)}%`";
|
||||
await TextCh.SendMessage(msgTxt);
|
||||
await textCh.SendMessage(msgTxt);
|
||||
} catch { }
|
||||
},
|
||||
};
|
||||
musicPlayers.TryAdd(TextCh.Server, musicPlayer);
|
||||
MusicPlayers.TryAdd(textCh.Server, musicPlayer);
|
||||
}
|
||||
var resolvedSong = await Song.ResolveSong(query, musicType);
|
||||
resolvedSong.MusicPlayer = musicPlayer;
|
||||
if (!silent)
|
||||
await TextCh.Send($"🎵`Queued`{resolvedSong.PrettyName}");
|
||||
await textCh.Send($"🎵`Queued`{resolvedSong.PrettyName}");
|
||||
musicPlayer.AddSong(resolvedSong);
|
||||
}
|
||||
}
|
||||
|
@ -7,11 +7,7 @@ using NadekoBot.Classes;
|
||||
namespace NadekoBot.Modules {
|
||||
internal class NSFW : DiscordModule {
|
||||
|
||||
private Random _r = new Random();
|
||||
|
||||
public NSFW() {
|
||||
|
||||
}
|
||||
private readonly Random rng = new Random();
|
||||
|
||||
public override void Install(ModuleManager manager) {
|
||||
manager.CreateCommands("", cgb => {
|
||||
@ -22,9 +18,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Shows a random NSFW hentai image from gelbooru and danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +)\n**Usage**: ~hentai yuri+kissing")
|
||||
.Parameter("tag", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
string tag = e.GetArg("tag");
|
||||
if (tag == null)
|
||||
tag = "";
|
||||
var tag = e.GetArg("tag")?.Trim() ?? "";
|
||||
await e.Channel.SendMessage(":heart: Gelbooru: " + await SearchHelper.GetGelbooruImageLink(tag));
|
||||
await e.Channel.SendMessage(":heart: Danbooru: " + await SearchHelper.GetDanbooruImageLink(tag));
|
||||
});
|
||||
@ -32,27 +26,21 @@ namespace NadekoBot.Modules {
|
||||
.Description("Shows a random hentai image from danbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +)\n**Usage**: ~danbooru yuri+kissing")
|
||||
.Parameter("tag", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
string tag = e.GetArg("tag");
|
||||
if (tag == null)
|
||||
tag = "";
|
||||
var tag = e.GetArg("tag")?.Trim() ?? "";
|
||||
await e.Channel.SendMessage(await SearchHelper.GetDanbooruImageLink(tag));
|
||||
});
|
||||
cgb.CreateCommand("~gelbooru")
|
||||
.Description("Shows a random hentai image from gelbooru with a given tag. Tag is optional but preffered. (multiple tags are appended with +)\n**Usage**: ~gelbooru yuri+kissing")
|
||||
.Parameter("tag", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
string tag = e.GetArg("tag");
|
||||
if (tag == null)
|
||||
tag = "";
|
||||
var tag = e.GetArg("tag")?.Trim() ?? "";
|
||||
await e.Channel.SendMessage(await SearchHelper.GetGelbooruImageLink(tag));
|
||||
});
|
||||
cgb.CreateCommand("~e621")
|
||||
.Description("Shows a random hentai image from e621.net with a given tag. Tag is optional but preffered. Use spaces for multiple tags.\n**Usage**: ~e621 yuri+kissing")
|
||||
.Parameter("tag", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
string tag = e.GetArg("tag");
|
||||
if (tag == null)
|
||||
tag = "";
|
||||
var tag = e.GetArg("tag")?.Trim() ?? "";
|
||||
await e.Channel.SendMessage(await SearchHelper.GetE621ImageLink(tag));
|
||||
});
|
||||
cgb.CreateCommand("~cp")
|
||||
@ -65,12 +53,23 @@ namespace NadekoBot.Modules {
|
||||
.Description("Real adult content.")
|
||||
.Do(async e => {
|
||||
try {
|
||||
var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.oboobs.ru/boobs/{_r.Next(0, 9304)}"))[0];
|
||||
var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.oboobs.ru/boobs/{rng.Next(0, 9380)}"))[0];
|
||||
await e.Channel.SendMessage($"http://media.oboobs.ru/{ obj["preview"].ToString() }");
|
||||
} catch (Exception ex) {
|
||||
await e.Channel.SendMessage($"💢 {ex.Message}");
|
||||
}
|
||||
});
|
||||
cgb.CreateCommand("~butts")
|
||||
.Alias("~ass","~butt")
|
||||
.Description("Real adult content.")
|
||||
.Do(async e => {
|
||||
try {
|
||||
var obj = JArray.Parse(await SearchHelper.GetResponseStringAsync($"http://api.obutts.ru/butts/{rng.Next(0, 3373)}"))[0];
|
||||
await e.Channel.SendMessage($"http://media.obutts.ru/{ obj["preview"].ToString() }");
|
||||
} catch (Exception ex) {
|
||||
await e.Channel.SendMessage($"💢 {ex.Message}");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ namespace NadekoBot.Modules {
|
||||
public PermissionModule() {
|
||||
//Empty for now
|
||||
}
|
||||
|
||||
//todo word filtering/invite bans (?:discord(?:\.gg|app\.com\/invite)\/(?<id>([\w]{16}|(?:[\w]+-?){3})))
|
||||
public override void Install(ModuleManager manager) {
|
||||
var client = NadekoBot.Client;
|
||||
manager.CreateCommands("", cgb => {
|
||||
@ -51,7 +51,7 @@ namespace NadekoBot.Modules {
|
||||
.Parameter("arg", ParameterType.Required)
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("arg");
|
||||
bool val = PermissionHelper.ValidateBool(arg);
|
||||
var val = PermissionHelper.ValidateBool(arg);
|
||||
PermsHandler.SetVerbosity(e.Server, val);
|
||||
await e.Channel.SendMessage($"Verbosity set to {val}.");
|
||||
});
|
||||
@ -72,7 +72,7 @@ namespace NadekoBot.Modules {
|
||||
.Parameter("role", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("role");
|
||||
Discord.Role role = e.Server.EveryoneRole;
|
||||
var role = e.Server.EveryoneRole;
|
||||
if (!string.IsNullOrWhiteSpace(arg))
|
||||
try {
|
||||
role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
@ -95,7 +95,7 @@ namespace NadekoBot.Modules {
|
||||
.Parameter("channel", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("channel");
|
||||
Discord.Channel channel = e.Channel;
|
||||
var channel = e.Channel;
|
||||
if (!string.IsNullOrWhiteSpace(arg))
|
||||
try {
|
||||
channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
@ -117,7 +117,7 @@ namespace NadekoBot.Modules {
|
||||
.Parameter("user", ParameterType.Unparsed)
|
||||
.Do(async e => {
|
||||
var arg = e.GetArg("user");
|
||||
Discord.User user = e.User;
|
||||
var user = e.User;
|
||||
if (!string.IsNullOrWhiteSpace(e.GetArg("user")))
|
||||
try {
|
||||
user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
|
||||
@ -139,8 +139,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a module's permission at the server level.\n**Usage**: ;sm [module_name] enable")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
PermsHandler.SetServerModulePermission(e.Server, module, state);
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on this server.");
|
||||
@ -159,8 +159,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a command's permission at the server level.\n**Usage**: ;sc [command_name] disable")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
PermsHandler.SetServerCommandPermission(e.Server, command, state);
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on this server.");
|
||||
@ -180,8 +180,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a module's permission at the role level.\n**Usage**: ;rm [module_name] enable [role_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
if (e.GetArg("role")?.ToLower() == "all") {
|
||||
foreach (var role in e.Server.Roles) {
|
||||
@ -190,7 +190,7 @@ namespace NadekoBot.Modules {
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.");
|
||||
}
|
||||
else {
|
||||
Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
|
||||
PermsHandler.SetRoleModulePermission(role, module, state);
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.");
|
||||
@ -211,8 +211,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a command's permission at the role level.\n**Usage**: ;rc [command_name] disable [role_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
if (e.GetArg("role")?.ToLower() == "all") {
|
||||
foreach (var role in e.Server.Roles) {
|
||||
@ -221,7 +221,7 @@ namespace NadekoBot.Modules {
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **ALL** roles.");
|
||||
}
|
||||
else {
|
||||
Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
|
||||
PermsHandler.SetRoleCommandPermission(role, command, state);
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{role.Name}** role.");
|
||||
@ -242,8 +242,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a module's permission at the channel level.\n**Usage**: ;cm [module_name] enable [channel_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
if (e.GetArg("channel")?.ToLower() == "all") {
|
||||
foreach (var channel in e.Server.TextChannels) {
|
||||
@ -252,7 +252,7 @@ namespace NadekoBot.Modules {
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.");
|
||||
}
|
||||
else {
|
||||
Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
|
||||
PermsHandler.SetChannelModulePermission(channel, module, state);
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.");
|
||||
@ -273,8 +273,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a command's permission at the channel level.\n**Usage**: ;cc [command_name] enable [channel_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
if (e.GetArg("channel")?.ToLower() == "all") {
|
||||
foreach (var channel in e.Server.TextChannels) {
|
||||
@ -283,7 +283,7 @@ namespace NadekoBot.Modules {
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** on **ALL** channels.");
|
||||
}
|
||||
else {
|
||||
Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
|
||||
PermsHandler.SetChannelCommandPermission(channel, command, state);
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for **{channel.Name}** channel.");
|
||||
@ -304,9 +304,9 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a module's permission at the user level.\n**Usage**: ;um [module_name] enable [user_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
|
||||
|
||||
PermsHandler.SetUserModulePermission(user, module, state);
|
||||
await e.Channel.SendMessage($"Module **{module}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.");
|
||||
@ -326,9 +326,9 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets a command's permission at the user level.\n**Usage**: ;uc [command_name] enable [user_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
string command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
Discord.User user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
|
||||
var command = PermissionHelper.ValidateCommand(e.GetArg("command"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var user = PermissionHelper.ValidateUser(e.Server, e.GetArg("user"));
|
||||
|
||||
PermsHandler.SetUserCommandPermission(user, command, state);
|
||||
await e.Channel.SendMessage($"Command **{command}** has been **{(state ? "enabled" : "disabled")}** for user **{user.Name}**.");
|
||||
@ -346,7 +346,7 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all modules at the server level.\n**Usage**: ;asm [enable/disable]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
|
||||
foreach (var module in NadekoBot.Client.GetService<ModuleService>().Modules) {
|
||||
PermsHandler.SetServerModulePermission(e.Server, module.Name, state);
|
||||
@ -367,8 +367,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all commands from a certain module at the server level.\n**Usage**: ;asc [module_name] [enable/disable]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
|
||||
foreach (var command in NadekoBot.Client.GetService<CommandService>().AllCommands.Where(c => c.Category == module)) {
|
||||
PermsHandler.SetServerCommandPermission(e.Server, command.Text, state);
|
||||
@ -389,8 +389,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all modules at the channel level.\n**Usage**: ;acm [enable/disable] [channel_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
foreach (var module in NadekoBot.Client.GetService<ModuleService>().Modules) {
|
||||
PermsHandler.SetChannelModulePermission(channel, module.Name, state);
|
||||
}
|
||||
@ -412,9 +412,9 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all commands from a certain module at the channel level.\n**Usage**: ;acc [module_name] [enable/disable] [channel_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
Discord.Channel channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var channel = PermissionHelper.ValidateChannel(e.Server, e.GetArg("channel"));
|
||||
foreach (var command in NadekoBot.Client.GetService<CommandService>().AllCommands.Where(c => c.Category == module)) {
|
||||
PermsHandler.SetChannelCommandPermission(channel, command.Text, state);
|
||||
}
|
||||
@ -434,8 +434,8 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all modules at the role level.\n**Usage**: ;arm [enable/disable] [role_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("role"));
|
||||
foreach (var module in NadekoBot.Client.GetService<ModuleService>().Modules) {
|
||||
PermsHandler.SetRoleModulePermission(role, module.Name, state);
|
||||
}
|
||||
@ -457,9 +457,9 @@ namespace NadekoBot.Modules {
|
||||
.Description("Sets permissions for all commands from a certain module at the role level.\n**Usage**: ;arc [module_name] [enable/disable] [channel_name]")
|
||||
.Do(async e => {
|
||||
try {
|
||||
bool state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
string module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
Discord.Role role = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel"));
|
||||
var state = PermissionHelper.ValidateBool(e.GetArg("bool"));
|
||||
var module = PermissionHelper.ValidateModule(e.GetArg("module"));
|
||||
var role = PermissionHelper.ValidateRole(e.Server, e.GetArg("channel"));
|
||||
foreach (var command in NadekoBot.Client.GetService<CommandService>().AllCommands.Where(c => c.Category == module)) {
|
||||
PermsHandler.SetRoleCommandPermission(role, command.Text, state);
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ using Discord.Modules;
|
||||
using Discord.Audio;
|
||||
using System.Timers;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using NadekoBot.Classes;
|
||||
using NadekoBot.Classes.JSONModels;
|
||||
@ -23,6 +24,7 @@ namespace NadekoBot {
|
||||
private static Channel OwnerPrivateChannel { get; set; }
|
||||
|
||||
private static void Main() {
|
||||
Console.OutputEncoding = Encoding.Unicode;
|
||||
try {
|
||||
//load credentials from credentials.json
|
||||
Creds = JsonConvert.DeserializeObject<Credentials>(File.ReadAllText("credentials.json"));
|
||||
|
@ -118,6 +118,7 @@
|
||||
<Compile Include="Classes\DBHandler.cs" />
|
||||
<Compile Include="Classes\FlowersHandler.cs" />
|
||||
<Compile Include="Classes\JSONModels\AnimeResult.cs" />
|
||||
<Compile Include="Classes\JSONModels\Config.cs" />
|
||||
<Compile Include="Classes\JSONModels\MangaResult.cs" />
|
||||
<Compile Include="Classes\JSONModels\_JSONModels.cs" />
|
||||
<Compile Include="Classes\Music\MusicControls.cs" />
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user