forked from EllieBotDevs/elliebot
249 lines
No EOL
7.4 KiB
C#
249 lines
No EOL
7.4 KiB
C#
using EllieBot.Db.Models;
|
|
using System.Text;
|
|
|
|
namespace EllieBot.Modules.Utility;
|
|
|
|
public partial class Utility
|
|
{
|
|
[Group("todo")]
|
|
public partial class Todo : EllieModule<TodoService>
|
|
{
|
|
[Cmd]
|
|
public async Task TodoAdd([Leftover] string todo)
|
|
{
|
|
var result = await _service.AddAsync(ctx.User.Id, todo);
|
|
if (result == TodoAddResult.MaxLimitReached)
|
|
{
|
|
await Response().Error(strs.todo_add_max_limit).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoEdit(kwum todoId, [Leftover] string newMessage)
|
|
{
|
|
if (!await _service.EditAsync(ctx.User.Id, todoId, newMessage))
|
|
{
|
|
await Response().Error(strs.todo_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoList()
|
|
{
|
|
var todos = await _service.GetAllTodosAsync(ctx.User.Id);
|
|
|
|
if (todos.Length == 0)
|
|
{
|
|
await Response().Error(strs.todo_list_empty).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await Response()
|
|
.Paginated()
|
|
.Items(todos)
|
|
.PageSize(9)
|
|
.AddFooter(false)
|
|
.Page((items, _) =>
|
|
{
|
|
var eb = CreateEmbed()
|
|
.WithOkColor()
|
|
.WithTitle(GetText(strs.todo_list));
|
|
|
|
ShowTodoItem(items, eb);
|
|
|
|
eb.WithFooter(GetText(strs.todo_stats(todos.Length,
|
|
todos.Count(x => x.IsDone),
|
|
todos.Count(x => !x.IsDone))));
|
|
|
|
return eb;
|
|
})
|
|
.SendAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoShow(kwum todoId)
|
|
{
|
|
var todo = await _service.GetTodoAsync(ctx.User.Id, todoId);
|
|
|
|
if (todo is null)
|
|
{
|
|
await Response().Error(strs.todo_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await Response()
|
|
.Confirm($"`{new kwum(todo.Id)}` {todo.Todo}")
|
|
.SendAsync();
|
|
}
|
|
|
|
|
|
[Cmd]
|
|
public async Task TodoComplete(kwum todoId)
|
|
{
|
|
if (!await _service.CompleteTodoAsync(ctx.User.Id, todoId))
|
|
{
|
|
await Response().Error(strs.todo_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoUncomplete(kwum todoId)
|
|
{
|
|
if (!await _service.UncompleteTodoAsync(ctx.User.Id, todoId))
|
|
{
|
|
await Response().Error(strs.todo_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoDelete(kwum todoId)
|
|
{
|
|
if (!await _service.DeleteTodoAsync(ctx.User.Id, todoId))
|
|
{
|
|
await Response().Error(strs.todo_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoClear()
|
|
{
|
|
await _service.ClearTodosAsync(ctx.User.Id);
|
|
|
|
await Response().Confirm(strs.todo_cleared).SendAsync();
|
|
}
|
|
|
|
|
|
private static void ShowTodoItem(IReadOnlyCollection<TodoModel> todos, EmbedBuilder eb)
|
|
{
|
|
var sb = new StringBuilder();
|
|
foreach (var todo in todos)
|
|
{
|
|
sb.AppendLine(InternalItemShow(todo));
|
|
|
|
sb.AppendLine("---");
|
|
}
|
|
|
|
eb.WithDescription(sb.ToString());
|
|
}
|
|
|
|
private static string InternalItemShow(TodoModel todo)
|
|
=> $"{(todo.IsDone ? "✔" : "□")} {Format.Code(new kwum(todo.Id).ToString())} {todo.Todo}";
|
|
|
|
[Group("archive")]
|
|
public partial class ArchiveCommands : EllieModule<TodoService>
|
|
{
|
|
[Cmd]
|
|
public async Task TodoArchiveAdd([Leftover] string name)
|
|
{
|
|
var result = await _service.ArchiveTodosAsync(ctx.User.Id, name);
|
|
if (result == ArchiveTodoResult.NoTodos)
|
|
{
|
|
await Response().Error(strs.todo_no_todos).SendAsync();
|
|
return;
|
|
}
|
|
|
|
if (result == ArchiveTodoResult.MaxLimitReached)
|
|
{
|
|
await Response().Error(strs.todo_archive_max_limit).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoArchiveList(int page = 1)
|
|
{
|
|
if (--page < 0)
|
|
return;
|
|
|
|
var archivedTodoLists = await _service.GetArchivedTodosAsync(ctx.User.Id);
|
|
|
|
if (archivedTodoLists.Count == 0)
|
|
{
|
|
await Response().Error(strs.todo_archive_empty).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await Response()
|
|
.Paginated()
|
|
.Items(archivedTodoLists)
|
|
.PageSize(9)
|
|
.CurrentPage(page)
|
|
.Page((items, _) =>
|
|
{
|
|
var eb = CreateEmbed()
|
|
.WithTitle(GetText(strs.todo_archive_list))
|
|
.WithOkColor();
|
|
|
|
foreach (var archivedList in items)
|
|
{
|
|
eb.AddField($"id: {archivedList.Id.ToString()}", archivedList.Name, true);
|
|
}
|
|
|
|
return eb;
|
|
})
|
|
.SendAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoArchiveShow(int id)
|
|
{
|
|
var list = await _service.GetArchivedTodoListAsync(ctx.User.Id, id);
|
|
if (list == null || list.Items.Count == 0)
|
|
{
|
|
await Response().Error(strs.todo_archive_not_found).SendAsync();
|
|
return;
|
|
}
|
|
|
|
await Response()
|
|
.Paginated()
|
|
.Items(list.Items)
|
|
.PageSize(9)
|
|
.AddFooter(false)
|
|
.Page((items, _) =>
|
|
{
|
|
var eb = CreateEmbed()
|
|
.WithOkColor()
|
|
.WithTitle(GetText(strs.todo_archived_list));
|
|
|
|
ShowTodoItem(items, eb);
|
|
|
|
eb.WithFooter(GetText(strs.todo_stats(list.Items.Count,
|
|
list.Items.Count(x => x.IsDone),
|
|
list.Items.Count(x => !x.IsDone))));
|
|
|
|
return eb;
|
|
})
|
|
.SendAsync();
|
|
}
|
|
|
|
[Cmd]
|
|
public async Task TodoArchiveDelete(int id)
|
|
{
|
|
if (!await _service.ArchiveDeleteAsync(ctx.User.Id, id))
|
|
{
|
|
await ctx.ErrorAsync();
|
|
return;
|
|
}
|
|
|
|
await ctx.OkAsync();
|
|
}
|
|
}
|
|
}
|
|
} |