NadekoBot/src/NadekoBot/Modules/Administration/Commands/PlayingRotateCommands.cs

158 lines
6.4 KiB
C#
Raw Normal View History

2016-08-27 00:41:41 +00:00
using Discord;
using Discord.Commands;
using NadekoBot.Attributes;
using NadekoBot.Extensions;
2016-08-27 00:41:41 +00:00
using NadekoBot.Services;
using NadekoBot.Services.Database.Models;
using NLog;
2016-08-27 00:41:41 +00:00
using System;
using System.Collections.Generic;
2016-12-29 13:56:15 +00:00
using System.Diagnostics;
2016-08-27 00:41:41 +00:00
using System.Linq;
using System.Threading.Tasks;
2016-08-27 00:41:41 +00:00
namespace NadekoBot.Modules.Administration
{
public partial class Administration
{
[Group]
2016-12-17 00:16:14 +00:00
public class PlayingRotateCommands : ModuleBase
2016-08-27 00:41:41 +00:00
{
2016-12-08 17:35:34 +00:00
private static Logger _log { get; }
public static List<PlayingStatus> RotatingStatusMessages { get; }
public static bool RotatingStatuses { get; private set; } = false;
2016-12-29 13:56:15 +00:00
//todo wtf is with this while(true) in constructor
static PlayingRotateCommands()
{
2016-12-29 13:56:15 +00:00
_log = LogManager.GetCurrentClassLogger();
2017-01-12 00:21:32 +00:00
RotatingStatusMessages = NadekoBot.BotConfig.RotatingStatusMessages;
RotatingStatuses = NadekoBot.BotConfig.RotatingStatuses;
2016-12-08 17:35:34 +00:00
var t = Task.Run(async () =>
{
var index = 0;
do
{
try
{
if (!RotatingStatuses)
continue;
else
{
if (index >= RotatingStatusMessages.Count)
index = 0;
if (!RotatingStatusMessages.Any())
continue;
var status = RotatingStatusMessages[index++].Status;
if (string.IsNullOrWhiteSpace(status))
continue;
PlayingPlaceholders.ForEach(e => status = status.Replace(e.Key, e.Value()));
2017-01-15 01:08:14 +00:00
await NadekoBot.Client.SetGameAsync(status).ConfigureAwait(false);
}
}
catch (Exception ex)
{
_log.Warn("Rotating playing status errored.\n" + ex);
}
finally
{
await Task.Delay(TimeSpan.FromMinutes(1));
}
} while (true);
});
}
2016-08-27 00:41:41 +00:00
public static Dictionary<string, Func<string>> PlayingPlaceholders { get; } =
new Dictionary<string, Func<string>> {
2017-01-15 01:28:33 +00:00
{"%servers%", () => NadekoBot.Client.GetGuildCount().ToString()},
2017-01-07 17:32:33 +00:00
{"%users%", () => NadekoBot.Client.GetGuilds().Sum(s => s.Users.Count).ToString()},
2016-08-27 00:41:41 +00:00
{"%playing%", () => {
var cnt = Music.Music.MusicPlayers.Count(kvp => kvp.Value.CurrentSong != null);
if (cnt != 1) return cnt.ToString();
try {
var mp = Music.Music.MusicPlayers.FirstOrDefault();
return mp.Value.CurrentSong.SongInfo.Title;
}
catch {
return "No songs";
}
}
},
{"%queued%", () => Music.Music.MusicPlayers.Sum(kvp => kvp.Value.Playlist.Count).ToString()},
{ "%time%", () => DateTime.Now.ToString("hh:mm "+TimeZoneInfo.Local.StandardName.GetInitials()) }
2016-08-27 00:41:41 +00:00
};
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
2016-12-16 18:43:57 +00:00
public async Task RotatePlaying()
2016-08-27 00:41:41 +00:00
{
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.BotConfig.GetOrCreate();
RotatingStatuses = config.RotatingStatuses = !config.RotatingStatuses;
2016-08-27 00:41:41 +00:00
await uow.CompleteAsync();
}
if (RotatingStatuses)
2016-12-16 18:43:57 +00:00
await Context.Channel.SendConfirmAsync("🆗 **Rotating playing status enabled.**").ConfigureAwait(false);
else
2016-12-16 18:43:57 +00:00
await Context.Channel.SendConfirmAsync(" **Rotating playing status disabled.**").ConfigureAwait(false);
2016-08-27 00:41:41 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task AddPlaying([Remainder] string status)
2016-08-27 00:41:41 +00:00
{
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.BotConfig.GetOrCreate();
var toAdd = new PlayingStatus { Status = status };
config.RotatingStatusMessages.Add(toAdd);
RotatingStatusMessages.Add(toAdd);
2016-08-27 00:41:41 +00:00
await uow.CompleteAsync();
}
2016-12-16 18:43:57 +00:00
await Context.Channel.SendConfirmAsync("✅ **Added.**").ConfigureAwait(false);
2016-08-27 00:41:41 +00:00
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
2016-12-16 18:43:57 +00:00
public async Task ListPlaying()
2016-08-27 00:41:41 +00:00
{
if (!RotatingStatusMessages.Any())
2016-12-16 18:43:57 +00:00
await Context.Channel.SendErrorAsync("❎ **No rotating playing statuses set.**");
2016-08-27 00:41:41 +00:00
else
{
var i = 1;
2016-12-16 18:43:57 +00:00
await Context.Channel.SendConfirmAsync($" {Context.User.Mention} `Here is a list of rotating statuses:`\n\n\t" + string.Join("\n\t", RotatingStatusMessages.Select(rs => $"`{i++}.` {rs.Status}")));
2016-08-27 00:41:41 +00:00
}
}
[NadekoCommand, Usage, Description, Aliases]
[OwnerOnly]
public async Task RemovePlaying(int index)
2016-08-27 00:41:41 +00:00
{
index -= 1;
2016-08-27 00:41:41 +00:00
string msg = "";
2016-08-27 00:41:41 +00:00
using (var uow = DbHandler.UnitOfWork())
{
var config = uow.BotConfig.GetOrCreate();
2016-08-27 00:41:41 +00:00
if (index >= config.RotatingStatusMessages.Count)
return;
msg = config.RotatingStatusMessages[index].Status;
2016-08-27 00:41:41 +00:00
config.RotatingStatusMessages.RemoveAt(index);
RotatingStatusMessages.RemoveAt(index);
2016-08-27 00:41:41 +00:00
await uow.CompleteAsync();
}
2016-12-16 18:43:57 +00:00
await Context.Channel.SendConfirmAsync($"🗑 **Removed the the playing message:** {msg}").ConfigureAwait(false);
2016-08-27 00:41:41 +00:00
}
}
}
2016-11-21 19:31:28 +00:00
}