mirror of https://github.com/JAJames/jessilib.git
Jessica James
3 years ago
22 changed files with 409 additions and 42 deletions
@ -0,0 +1,60 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "io/command.hpp" |
||||
|
#include "io/command_manager.hpp" |
||||
|
#include "shutdown.hpp" |
||||
|
|
||||
|
namespace jessibot { |
||||
|
namespace io { |
||||
|
|
||||
|
using namespace jessilib::io; |
||||
|
|
||||
|
command quit_command{ [](command_context& context) { |
||||
|
using namespace jessilib::io; |
||||
|
text quit_text{ "Closing jessibot", text::property::bold, color{ 0xFF0000 } }; // TODO: localize
|
||||
|
context.publicReply(formatted_message{ "{}", quit_text }); |
||||
|
notify_shutdown(); |
||||
|
}, "quit" }; |
||||
|
|
||||
|
// ISSUE: help command has no way to know what commands exist for the given context
|
||||
|
command help_command{ [](command_context& context) { |
||||
|
auto details = context.details(); |
||||
|
auto table_name = details["table"].get<std::string>(); |
||||
|
|
||||
|
if (table_name.empty()) { |
||||
|
text error_text{ "ERROR", text::property::bold, color{ 0xFF0000 } }; // TODO: localize
|
||||
|
context.publicReply(formatted_message{ "{} command context is missing permission table name", error_text }); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// table examples: "console", "irc", "irc+", "irc%", "irc@"; should table instead be 'tables'?
|
||||
|
|
||||
|
text table_text{ table_name, text::property::bold, color{ 0x0000FF } }; |
||||
|
context.publicReply(formatted_message{ "Commands for table '{}':", table_text }); |
||||
|
|
||||
|
// TODO: read some permission table and filter commands based upon permission and context information
|
||||
|
const command_manager& manager = command_manager::instance(); |
||||
|
manager.foreach([&context](basic_command* in_command) { |
||||
|
context.publicReply(formatted_message{ "{}", in_command->label() }); |
||||
|
return true; |
||||
|
}); |
||||
|
}, "help" }; |
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessibot
|
@ -0,0 +1,48 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "console.hpp" |
||||
|
|
||||
|
#include <iostream> |
||||
|
#include "io/command_manager.hpp" |
||||
|
#include "io/ansi/ansi_text.hpp" |
||||
|
#include "shutdown.hpp" |
||||
|
#include "console/console_command_context.hpp" |
||||
|
|
||||
|
namespace jessibot { |
||||
|
namespace io { |
||||
|
|
||||
|
void console_input_loop() { |
||||
|
using namespace jessilib::io; |
||||
|
|
||||
|
std::string input; |
||||
|
auto shutdown_future = get_shutdown_future(); |
||||
|
while (shutdown_future.wait_for(std::chrono::milliseconds(10)) != std::future_status::ready) { |
||||
|
std::getline(std::cin, input); // TODO: use a non-bloicking call and poll running periodically
|
||||
|
jessibot::io::console_command_context context{ input }; |
||||
|
if (!command_manager::instance().execute_command(context)) { |
||||
|
text error_text{ "ERROR", text::property::bold, color{ 0xFF0000 }}; |
||||
|
text keyword_text{ context.keyword(), text::property::bold, color{ 0x0000FF }}; |
||||
|
auto result = process_message<ansi::text_wrapper>(formatted_message{"{} Command \"{}\" not found", error_text, keyword_text}); |
||||
|
std::cout << result << std::endl; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessibot
|
@ -0,0 +1,30 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <atomic> |
||||
|
|
||||
|
namespace jessibot { |
||||
|
namespace io { |
||||
|
|
||||
|
void console_input_loop(); |
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessibot
|
||||
|
|
@ -0,0 +1,53 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "console_command_context.hpp" |
||||
|
|
||||
|
#include <iostream> |
||||
|
#include "io/ansi/ansi_text.hpp" |
||||
|
|
||||
|
namespace jessibot { |
||||
|
namespace io { |
||||
|
|
||||
|
/** Reply */ |
||||
|
bool console_command_context::privateReply(const jessilib::io::formatted_message& in_message) { |
||||
|
auto result = jessilib::io::process_message<jessilib::io::ansi::text_wrapper>(in_message); |
||||
|
std::cout << result << std::endl; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
bool console_command_context::publicReply(const jessilib::io::formatted_message& in_message) { |
||||
|
// Consoles only have 1 output mechanism
|
||||
|
return privateReply(in_message); |
||||
|
} |
||||
|
|
||||
|
/** Additional contextual details */ |
||||
|
jessilib::object console_command_context::details() const { |
||||
|
static jessilib::object s_details { |
||||
|
jessilib::object::map_t{ { "table", "console" } } |
||||
|
}; |
||||
|
|
||||
|
return s_details; |
||||
|
} |
||||
|
|
||||
|
std::string console_command_context::getText(std::string_view tag) const { |
||||
|
return { tag.begin(), tag.end() }; // TODO: implement properly
|
||||
|
} |
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessilib
|
@ -0,0 +1,41 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "io/command_context.hpp" |
||||
|
|
||||
|
namespace jessibot { |
||||
|
namespace io { |
||||
|
|
||||
|
class console_command_context : public jessilib::io::command_context { |
||||
|
public: |
||||
|
using jessilib::io::command_context::command_context; |
||||
|
|
||||
|
/** Reply */ |
||||
|
bool privateReply(const jessilib::io::formatted_message& in_message) override; |
||||
|
bool publicReply(const jessilib::io::formatted_message& in_message) override; |
||||
|
|
||||
|
/** Additional contextual details */ |
||||
|
jessilib::object details() const override; |
||||
|
std::string getText(std::string_view tag) const override; |
||||
|
}; // class console_command_context
|
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessibot
|
||||
|
|
@ -0,0 +1,38 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "shutdown.hpp" |
||||
|
|
||||
|
namespace jessibot { |
||||
|
|
||||
|
std::promise<void>& shutdown_promise() { |
||||
|
static std::promise<void> s_shutdown_promise; |
||||
|
return s_shutdown_promise; |
||||
|
} |
||||
|
|
||||
|
std::shared_future<void> get_shutdown_future() { |
||||
|
static std::shared_future<void> s_shutdown_future{ shutdown_promise().get_future().share() }; |
||||
|
return s_shutdown_future; |
||||
|
} |
||||
|
|
||||
|
void notify_shutdown() { |
||||
|
shutdown_promise().set_value(); |
||||
|
} |
||||
|
|
||||
|
} // namespace jessibot
|
||||
|
|
@ -0,0 +1,29 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <future> |
||||
|
|
||||
|
namespace jessibot { |
||||
|
|
||||
|
std::shared_future<void> get_shutdown_future(); |
||||
|
void notify_shutdown(); |
||||
|
|
||||
|
} // namespace jessibot
|
||||
|
|
@ -0,0 +1,52 @@ |
|||||
|
/**
|
||||
|
* Copyright (C) 2020 Jessica James. |
||||
|
* |
||||
|
* Permission to use, copy, modify, and/or distribute this software for any |
||||
|
* purpose with or without fee is hereby granted, provided that the above |
||||
|
* copyright notice and this permission notice appear in all copies. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY |
||||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION |
||||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN |
||||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
||||
|
* |
||||
|
* Written by Jessica James <jessica.aj@outlook.com> |
||||
|
*/ |
||||
|
|
||||
|
#include "io/command_manager.hpp" |
||||
|
|
||||
|
namespace jessilib { |
||||
|
namespace io { |
||||
|
|
||||
|
void command_manager::register_command(basic_command& in_command) { |
||||
|
std::lock_guard<std::shared_mutex> guard{ m_commands_mutex }; |
||||
|
m_commands.push_back(&in_command); |
||||
|
} |
||||
|
|
||||
|
void command_manager::unregister_command(basic_command& in_command) { |
||||
|
std::lock_guard<std::shared_mutex> guard{ m_commands_mutex }; |
||||
|
std::remove(m_commands.begin(), m_commands.end(), &in_command); |
||||
|
} |
||||
|
|
||||
|
bool command_manager::execute_command(command_context& in_context) { |
||||
|
std::shared_lock<std::shared_mutex> lock{ m_commands_mutex }; |
||||
|
for (auto& command : m_commands) { |
||||
|
if (in_context.keyword() == command->label()) { |
||||
|
command->execute(in_context); |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
command_manager& command_manager::instance() { |
||||
|
static command_manager s_command_manager; |
||||
|
return s_command_manager; |
||||
|
} |
||||
|
|
||||
|
} // namespace io
|
||||
|
} // namespace jessilib
|
Loading…
Reference in new issue