2016-08-27 00:41:41 +00:00
using Discord ;
using Discord.Commands ;
using NadekoBot.Attributes ;
2016-10-13 21:09:59 +00:00
using NadekoBot.Extensions ;
2016-08-27 00:41:41 +00:00
using NadekoBot.Services ;
using NadekoBot.Services.Database.Models ;
2016-08-28 00:46:36 +00:00
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-02-24 16:33:09 +00:00
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 ; }
2016-10-14 23:20:06 +00:00
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
2016-10-14 23:20:06 +00:00
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-08-28 00:46:36 +00:00
2016-12-08 17:35:34 +00:00
var t = Task . Run ( async ( ) = >
2016-08-28 00:46:36 +00:00
{
var index = 0 ;
do
{
try
{
2016-10-14 23:20:06 +00:00
if ( ! RotatingStatuses )
2016-08-28 00:46:36 +00:00
continue ;
else
{
2016-10-14 23:20:06 +00:00
if ( index > = RotatingStatusMessages . Count )
2016-08-28 00:46:36 +00:00
index = 0 ;
2016-10-14 23:20:06 +00:00
if ( ! RotatingStatusMessages . Any ( ) )
2016-08-28 00:46:36 +00:00
continue ;
2016-10-14 23:20:06 +00:00
var status = RotatingStatusMessages [ index + + ] . Status ;
2016-10-13 21:09:59 +00:00
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 ) ;
2016-08-28 00:46:36 +00:00
}
}
catch ( Exception ex )
{
_log . Warn ( "Rotating playing status errored.\n" + ex ) ;
}
finally
{
2016-10-27 23:56:51 +00:00
await Task . Delay ( TimeSpan . FromMinutes ( 1 ) ) ;
2016-08-28 00:46:36 +00:00
}
} 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" ;
}
}
} ,
2017-01-23 00:44:25 +00:00
{ "%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
} ;
2016-02-24 16:33:09 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-30 02:20:09 +00:00
[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 ( ) )
{
2016-08-28 00:46:36 +00:00
var config = uow . BotConfig . GetOrCreate ( ) ;
2016-02-24 16:33:09 +00:00
2016-10-14 23:20:06 +00:00
RotatingStatuses = config . RotatingStatuses = ! config . RotatingStatuses ;
2016-08-27 00:41:41 +00:00
await uow . CompleteAsync ( ) ;
}
2016-10-14 23:20:06 +00:00
if ( RotatingStatuses )
2016-12-16 18:43:57 +00:00
await Context . Channel . SendConfirmAsync ( "🆗 **Rotating playing status enabled.**" ) . ConfigureAwait ( false ) ;
2016-08-28 00:46:36 +00:00
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
}
2016-03-06 10:53:45 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-30 02:20:09 +00:00
[OwnerOnly]
2016-12-21 08:33:47 +00:00
public async Task AddPlaying ( [ Remainder ] string status )
2016-08-27 00:41:41 +00:00
{
using ( var uow = DbHandler . UnitOfWork ( ) )
{
2016-08-28 00:46:36 +00:00
var config = uow . BotConfig . GetOrCreate ( ) ;
2016-10-14 23:20:06 +00:00
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-02-24 16:33:09 +00:00
2016-12-16 18:43:57 +00:00
await Context . Channel . SendConfirmAsync ( "✅ **Added.**" ) . ConfigureAwait ( false ) ;
2016-08-27 00:41:41 +00:00
}
2016-02-24 16:33:09 +00:00
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-30 02:20:09 +00:00
[OwnerOnly]
2016-12-16 18:43:57 +00:00
public async Task ListPlaying ( )
2016-08-27 00:41:41 +00:00
{
2016-10-14 23:20:06 +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
}
}
2016-10-05 03:09:44 +00:00
[NadekoCommand, Usage, Description, Aliases]
2016-09-30 02:20:09 +00:00
[OwnerOnly]
2016-12-21 08:33:47 +00:00
public async Task RemovePlaying ( int index )
2016-08-27 00:41:41 +00:00
{
2016-08-28 00:46:36 +00:00
index - = 1 ;
2016-08-27 00:41:41 +00:00
2016-08-28 00:46:36 +00:00
string msg = "" ;
2016-08-27 00:41:41 +00:00
using ( var uow = DbHandler . UnitOfWork ( ) )
{
2016-08-28 00:46:36 +00:00
var config = uow . BotConfig . GetOrCreate ( ) ;
2016-08-27 00:41:41 +00:00
if ( index > = config . RotatingStatusMessages . Count )
return ;
2016-08-28 00:46:36 +00:00
msg = config . RotatingStatusMessages [ index ] . Status ;
2016-08-27 00:41:41 +00:00
config . RotatingStatusMessages . RemoveAt ( index ) ;
2016-10-14 23:20:06 +00:00
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
}