Finalizing the voice connection cleanup

This commit is contained in:
WolverinDEV 2020-07-29 22:53:36 +02:00
parent a15eb9d25c
commit 143322575d
4 changed files with 91 additions and 36 deletions

View File

@ -2,6 +2,7 @@
// Created by wolverindev on 17.10.17.
//
#include "./query/command3.h"
#include "Error.h"
using namespace ts;
@ -207,4 +208,59 @@ ErrorType ts::findError(std::string key){
for(auto elm : avariableErrors)
if(elm.name == key) return elm;
return ErrorType{1, key, "undefined"};
}
inline void write_command_result_error(ts::command_builder_bulk bulk, const command_result& result, const std::string_view& id_key) {
bulk.put_unchecked(id_key, (uint32_t) result.error_code());
bulk.put_unchecked("msg", findError(result.error_code()).message);
if(result.is_permission_error())
bulk.put_unchecked("failed_permid", (uint32_t) result.permission_id());
}
inline void write_command_result_detailed(ts::command_builder_bulk bulk, const command_result& result, const std::string_view& id_key) {
auto details = result.details();
bulk.put_unchecked(id_key, (uint32_t) details->error_id);
bulk.put_unchecked("msg", findError(details->error_id).message);
for(const auto& extra : details->extra_properties)
bulk.put(extra.first, extra.second);
}
void command_result::build_error_response(ts::command_builder &builder, const std::string_view &idKey) const {
switch(this->type()) {
case command_result_type::error:
write_command_result_error(builder.bulk(0), *this, idKey);
break;
case command_result_type::detailed:
write_command_result_detailed(builder.bulk(0), *this, idKey);
break;
case command_result_type::bulked: {
auto bulks = this->bulks();
builder.reserve_bulks(bulks->size());
for(size_t index{0}; index < bulks->size(); index++) {
auto& entry = bulks->at(index);
switch (entry.type()) {
case command_result_type::error:
write_command_result_error(builder.bulk(index), entry, idKey);
break;
case command_result_type::detailed:
write_command_result_detailed(builder.bulk(index), entry, idKey);
break;
case command_result_type::bulked:
assert(false);
break;
}
}
if(bulks->empty()) {
assert(false);
builder.put_unchecked(0, idKey, (uint32_t) error::ok);
builder.put_unchecked(0, "msg", findError(error::ok).message);
}
break;
}
default:
assert(false);
break;
}
}

View File

@ -275,17 +275,6 @@ namespace ts {
return (detailed_command_result*) (this->data & MASK_PTR);
}
#if 0 // Dont use release_details. Use release_data instead
[[nodiscard]] inline std::unique_ptr<detailed_command_result> release_details() {
auto type = this->type();
if(type != command_result_type::detailed) return nullptr;
auto result = this->details();
this->data = 0;
return std::unique_ptr<detailed_command_result>{result};
}
#endif
/* only valid for command_result_type::bulked */
[[nodiscard]] inline const std::vector<command_result>* bulks() const {
assert(this->type() == command_result_type::bulked);
@ -298,20 +287,9 @@ namespace ts {
return (std::vector<command_result>*) (this->data & MASK_PTR);
}
#if 0 // Dont use release_bulks. Use release_data instead
[[nodiscard]] inline std::vector<command_result> release_bulks() {
auto type = this->type();
if(type != command_result_type::bulked) return {};
std::vector<command_result> result{};
auto bulks = reinterpret_cast<std::vector<command_result>*>(this->data);
result.swap(*bulks);
delete bulks;
this->data = 0;
return result;
}
#ifdef COMMAND_BUILDER_DEFINED
void build_error_response(ts::command_builder& /* result */, const std::string_view& /* id key */) const;
#endif
inline command_result& reset(command_result&& other) {
this->release_data();
std::exchange(this->data, other.data);

View File

@ -10,14 +10,14 @@ using namespace ts;
command_bulk command_parser::empty_bulk{std::string::npos, 0, ""};
bool command_parser::parse(bool command) {
this->data = this->_command;
this->data = this->_command_memory;
this->index = std::string::npos;
size_t index{0}, findex;
if(command) {
index = this->_command.find(' ', index);
index = this->_command_memory.find(' ', index);
if(index == std::string::npos) {
this->command_type = this->_command;
this->command_type = this->_command_memory;
return true;
} else {
this->command_type = this->data.substr(0, index);
@ -27,10 +27,10 @@ bool command_parser::parse(bool command) {
}
this->_bulks.reserve(4);
while(index < this->_command.size()) {
findex = this->_command.find('|', index);
while(index < this->_command_memory.size()) {
findex = this->_command_memory.find('|', index);
if(findex == std::string::npos)
findex = this->_command.size();
findex = this->_command_memory.size();
this->_bulks.emplace_back(this->_bulks.size() - 1, index, this->data.substr(index, findex - index));
index = findex + 1;

View File

@ -141,7 +141,8 @@ namespace ts {
failed
};
explicit command_parser(std::string command) : impl::command_string_parser{std::string::npos, 0, command}, _command{std::move(command)} { }
explicit command_parser(std::string_view command) : impl::command_string_parser{std::string::npos, 0, command} { }
explicit command_parser(std::string command) : impl::command_string_parser{std::string::npos, 0, command}, _command_memory{std::move(command)} { }
bool parse(bool /* contains identifier */);
@ -158,9 +159,27 @@ namespace ts {
size_t index{0};
do {
index = this->data.find(key, index);
index -= 1;
if(index > key.size()) return false;
if(this->data[index] == '-') return index == 0 || this->data[index - 1] == ' ';
index--;
if(index > this->data.length())
return false; /* index was zero or std::string::npos*/
if(this->data[index] != '-') {
index += 2;
continue;
}
if(index != 0 && this->data[index - 1] != ' ') {
index += 2;
continue;
}
if(index + 1 + key.length() >= this->data.length())
return true;
if(this->data[index + 1 + key.length()] == ' ')
return true;
index += 2;
} while(true);
}
@ -171,7 +190,7 @@ namespace ts {
private:
static command_bulk empty_bulk;
const std::string _command{};
const std::string _command_memory{};
std::string_view command_type{};
std::vector<command_bulk> _bulks{};
};
@ -368,4 +387,6 @@ namespace ts {
};
using command_builder = command_builder_impl<>;
}
}
#define COMMAND_BUILDER_DEFINED