1
0
mirror of https://github.com/anope/anope.git synced 2026-06-29 22:46:37 +02:00

Replace convertTo/stringify with non-throwing alternatives.

Having these throw is terrible for ergonomics and there are loads
of places where the exception was either silently ignored or not
handled at all. Having a function which returns an optional and
another that returns a default works a lot better imo.
This commit is contained in:
Sadie Powell
2024-03-11 13:53:05 +00:00
parent e2df7d4d01
commit 29e7674e56
76 changed files with 572 additions and 810 deletions
+3 -66
View File
@@ -39,6 +39,7 @@ namespace Anope
typedef std::string::reverse_iterator reverse_iterator;
typedef std::string::const_reverse_iterator const_reverse_iterator;
typedef std::string::size_type size_type;
typedef std::string::value_type value_type;
static const size_type npos = static_cast<size_type>(-1);
/**
@@ -729,72 +730,6 @@ public:
virtual ~ModuleException() noexcept = default;
};
class CoreExport ConvertException final
: public CoreException
{
public:
ConvertException(const Anope::string &reason = "") : CoreException(reason) { }
virtual ~ConvertException() noexcept = default;
};
/** Convert something to a string
*/
inline Anope::string stringify(const Anope::string &x)
{
return x;
}
template<typename T> inline Anope::string stringify(const T &x)
{
std::ostringstream stream;
if (!(stream << x))
throw ConvertException("Stringify fail");
return stream.str();
}
template<typename T> inline void convert(const Anope::string &s, T &x, Anope::string &leftover, bool failIfLeftoverChars = true)
{
leftover.clear();
std::istringstream i(s.str());
char c;
if (!(i >> x))
throw ConvertException("Convert fail");
if (failIfLeftoverChars)
{
if (i.get(c))
throw ConvertException("Convert fail");
}
else
{
std::string left;
getline(i, left);
leftover = left;
}
}
template<typename T> inline void convert(const Anope::string &s, T &x, bool failIfLeftoverChars = true)
{
Anope::string Unused;
convert(s, x, Unused, failIfLeftoverChars);
}
template<typename T> inline T convertTo(const Anope::string &s, Anope::string &leftover, bool failIfLeftoverChars = true)
{
T x;
convert(s, x, leftover, failIfLeftoverChars);
return x;
}
template<typename T> inline T convertTo(const Anope::string &s, bool failIfLeftoverChars = true)
{
T x;
convert(s, x, failIfLeftoverChars);
return x;
}
/** Casts to be used instead of dynamic_cast, this uses dynamic_cast
* for debug builds and static_cast on release builds
* to speed up the program because dynamic_cast relies on RTTI.
@@ -814,3 +749,5 @@ template<typename T, typename O> inline T anope_dynamic_static_cast(O ptr)
return static_cast<T>(ptr);
}
#endif
#include "convert.h"
+1 -8
View File
@@ -46,14 +46,7 @@ namespace Configuration
template<typename T> T Get(const Anope::string &tag, const Anope::string &def = "") const
{
const Anope::string &value = this->Get<const Anope::string>(tag, def);
if (!value.empty())
try
{
return convertTo<T>(value);
}
catch (const ConvertException &) { }
return T();
return Anope::TryConvert<T>(this->Get<const Anope::string>(tag, def)).value_or(T());
}
bool Set(const Anope::string &tag, const Anope::string &value);
+133
View File
@@ -0,0 +1,133 @@
/*
*
* (C) 2003-2024 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*/
#pragma once
#include <optional>
namespace Anope
{
/** Attempts to convert a string to any type.
* @param in The value to convert.
* @param leftover If non-nullptr then the location to store leftover data.
*/
template<typename T>
inline std::optional<T> TryConvert(const Anope::string &in, Anope::string *leftover = nullptr)
{
std::istringstream tmp(in.str());
T out;
if (!(tmp >> out))
return std::nullopt;
if (leftover)
{
std::string extra;
std::getline(tmp, extra);
*leftover = extra;
}
else
{
char extra;
if (tmp >> extra)
return std::nullopt;
}
return out;
}
/** Converts a string to any type.
* @param in The value to convert.
* @param def The default to use if the conversion failed.
* @param leftover If non-nullptr then the location to store leftover data.
*/
template<typename T>
inline T Convert(const Anope::string &in, T def, Anope::string *leftover = nullptr)
{
return TryConvert<T>(in, leftover).value_or(def);
}
/** Attempts to convert any type to a string.
* @param in The value to convert.
*/
template <class T>
inline std::optional<Anope::string> TryString(const T &in)
{
std::ostringstream tmp;
if (!(tmp << in))
return std::nullopt;
return tmp.str();
}
/** No-op function that returns the string that was passed to it.
* @param in The string to return.
*/
inline const string &ToString(const string &in)
{
return in;
}
/** Converts a std::string to a string.
* @param in The value to convert.
*/
inline string ToString(const std::string &in)
{
return in;
}
/** Converts a char array to a string.
* @param in The value to convert.
*/
inline string ToString(const char *in)
{
return string(in);
}
/** Converts a char to a string.
* @param in The value to convert.
*/
inline string ToString(char in)
{
return string(1, static_cast<string::value_type>(in));
}
/** Converts an unsigned char to a string.
* @param in The value to convert.
*/
inline string ToString(unsigned char in)
{
return string(1, static_cast<string::value_type>(in));
}
/** Converts a bool to a string.
* @param in The value to convert.
*/
inline string ToString(bool in)
{
return (in ? "1" : "0");
}
/** Converts a type that std::to_string is implemented for to a string.
* @param in The value to convert.
*/
template<typename Stringable>
inline std::enable_if_t<std::is_arithmetic_v<Stringable>, string> ToString(const Stringable &in)
{
return std::to_string(in);
}
/** Converts any type to a string.
* @param in The value to convert.
*/
template <class T>
inline std::enable_if_t<!std::is_arithmetic_v<T>, string> ToString(const T &in)
{
return TryString(in).value_or(Anope::string());
}
}
+6 -7
View File
@@ -128,13 +128,12 @@ namespace SQL
template<typename T> void SetValue(const Anope::string &key, const T &value, bool escape = true)
{
try
{
Anope::string string_value = stringify(value);
this->parameters[key].data = string_value;
this->parameters[key].escape = escape;
}
catch (const ConvertException &ex) { }
auto str = Anope::TryString(value);
if (!str.has_value())
return;
this->parameters[key].data = str.value();
this->parameters[key].escape = escape;
}
};
+3 -3
View File
@@ -164,14 +164,14 @@ public:
template <typename... Args>
void SendMode(const MessageSource &source, Channel *chan, const Anope::string &modes, Args &&...args)
{
SendModeInternal(source, chan, modes, { stringify(args)... });
SendModeInternal(source, chan, modes, { Anope::ToString(args)... });
}
virtual void SendModeInternal(const MessageSource &source, User *u, const Anope::string &modes, const std::vector<Anope::string> &values);
template <typename... Args>
void SendMode(const MessageSource &source, User *u, const Anope::string &modes, Args &&...args)
{
SendModeInternal(source, u, modes, { stringify(args)... });
SendModeInternal(source, u, modes, { Anope::ToString(args)... });
}
/** Introduces a client to the rest of the network
@@ -258,7 +258,7 @@ public:
template <typename... Args>
void SendNumeric(int numeric, const Anope::string &dest, Args &&...args)
{
SendNumericInternal(numeric, dest, { stringify(args)... });
SendNumericInternal(numeric, dest, { Anope::ToString(args)... });
}
virtual void SendLogin(User *u, NickAlias *na) = 0;
+4 -4
View File
@@ -23,25 +23,25 @@ namespace Uplink
template<typename... Args>
void Send(const Anope::map<Anope::string> &tags, const MessageSource &source, const Anope::string &command, Args &&...args)
{
SendInternal(tags, source, command, { stringify(args)... });
SendInternal(tags, source, command, { Anope::ToString(args)... });
}
template<typename... Args>
void Send(const Anope::map<Anope::string> &tags, const Anope::string &command, Args &&...args)
{
SendInternal(tags, Me, command, { stringify(args)... });
SendInternal(tags, Me, command, { Anope::ToString(args)... });
}
template<typename... Args>
void Send(const MessageSource &source, const Anope::string &command, Args &&...args)
{
SendInternal({}, source, command, { stringify(args)... });
SendInternal({}, source, command, { Anope::ToString(args)... });
}
template<typename... Args>
void Send(const Anope::string &command, Args &&...args)
{
SendInternal({}, Me, command, { stringify(args)... });
SendInternal({}, Me, command, { Anope::ToString(args)... });
}
}
+2 -6
View File
@@ -67,12 +67,8 @@ public:
Anope::string Limit;
unsigned limit = 0;
try
{
if (c->GetParam("LIMIT", Limit))
limit = convertTo<unsigned>(Limit);
}
catch (const ConvertException &) { }
if (c->GetParam("LIMIT", Limit))
limit = Anope::Convert<unsigned>(Limit, limit);
/* Should we be invited? */
if (c->HasMode("INVITE") || (limit && c->users.size() >= limit))
+2 -2
View File
@@ -222,7 +222,7 @@ private:
const BadWord *b = bw->GetBadWord(Number - 1);
ListFormatter::ListEntry entry;
entry["Number"] = stringify(Number);
entry["Number"] = Anope::ToString(Number);
entry["Word"] = b->word;
entry["Type"] = b->type == BW_SINGLE ? "(SINGLE)" : (b->type == BW_START ? "(START)" : (b->type == BW_END ? "(END)" : ""));
this->list.AddEntry(entry);
@@ -241,7 +241,7 @@ private:
continue;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Word"] = b->word;
entry["Type"] = b->type == BW_SINGLE ? "(SINGLE)" : (b->type == BW_START ? "(START)" : (b->type == BW_END ? "(END)" : ""));
list.AddEntry(entry);
+1 -1
View File
@@ -55,7 +55,7 @@ public:
info[_("Real name")] = bi->realname;
info[_("Created")] = Anope::strftime(bi->created, source.GetAccount());
info[_("Options")] = bi->oper_only ? _("Private") : _("None");
info[_("Used on")] = stringify(bi->GetChannelCount()) + " channel(s)";
info[_("Used on")] = Anope::ToString(bi->GetChannelCount()) + " channel(s)";
FOREACH_MOD(OnBotInfo, (source, bi, ci, info));
+21 -75
View File
@@ -106,11 +106,10 @@ struct KickerDataImpl final
data["ttb"] >> ttb;
spacesepstream sep(ttb);
for (int i = 0; sep.GetToken(tok) && i < TTB_SIZE; ++i)
try
{
kd->ttb[i] = convertTo<int16_t>(tok);
}
catch (const ConvertException &) { }
{
if (auto n = Anope::TryConvert<int16_t>(tok))
kd->ttb[i] = n.value();
}
kd->Check(ci);
}
@@ -206,21 +205,13 @@ protected:
{
if (!ttb.empty())
{
int16_t i;
try
{
i = convertTo<int16_t>(ttb);
if (i < 0)
throw ConvertException();
}
catch (const ConvertException &)
kd->ttb[ttb_idx] = Anope::Convert<int16_t>(ttb, -1);
if (kd->ttb[ttb_idx] < 0)
{
kd->ttb[ttb_idx] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
return;
}
kd->ttb[ttb_idx] = i;
}
else
kd->ttb[ttb_idx] = 0;
@@ -386,13 +377,8 @@ public:
if (!ttb.empty())
{
try
{
kd->ttb[TTB_CAPS] = convertTo<int16_t>(ttb);
if (kd->ttb[TTB_CAPS] < 0)
throw ConvertException();
}
catch (const ConvertException &)
kd->ttb[TTB_CAPS] = Anope::Convert<int16_t>(ttb, -1);
if (kd->ttb[TTB_CAPS] < 0)
{
kd->ttb[TTB_CAPS] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
@@ -402,21 +388,11 @@ public:
else
kd->ttb[TTB_CAPS] = 0;
kd->capsmin = 10;
try
{
kd->capsmin = convertTo<int16_t>(min);
}
catch (const ConvertException &) { }
kd->capsmin = Anope::Convert(min, 0);
if (kd->capsmin < 1)
kd->capsmin = 10;
kd->capspercent = 25;
try
{
kd->capspercent = convertTo<int16_t>(percent);
}
catch (const ConvertException &) { }
kd->capspercent = Anope::Convert(percent, 0);
if (kd->capspercent < 1 || kd->capspercent > 100)
kd->capspercent = 25;
@@ -518,42 +494,25 @@ public:
if (!ttb.empty())
{
int16_t i;
try
{
i = convertTo<int16_t>(ttb);
if (i < 0)
throw ConvertException();
}
catch (const ConvertException &)
kd->ttb[TTB_FLOOD] = Anope::Convert<int16_t>(ttb, -1);
if (kd->ttb[TTB_FLOOD] < 0)
{
kd->ttb[TTB_FLOOD] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
return;
}
kd->ttb[TTB_FLOOD] = i;
}
else
kd->ttb[TTB_FLOOD] = 0;
kd->floodlines = 6;
try
{
kd->floodlines = convertTo<int16_t>(lines);
}
catch (const ConvertException &) { }
kd->floodlines = Anope::Convert(lines, -1);
if (kd->floodlines < 2)
kd->floodlines = 6;
kd->floodsecs = 10;
try
{
kd->floodsecs = convertTo<int16_t>(secs);
}
catch (const ConvertException &) { }
kd->floodsecs = Anope::Convert(secs, -1);
if (kd->floodsecs < 1)
kd->floodsecs = 10;
if (kd->floodsecs > Config->GetModule(me)->Get<time_t>("keepdata"))
kd->floodsecs = Config->GetModule(me)->Get<time_t>("keepdata");
@@ -651,31 +610,18 @@ public:
if (!ttb.empty())
{
int16_t i;
try
{
i = convertTo<int16_t>(ttb);
if (i < 0)
throw ConvertException();
}
catch (const ConvertException &)
kd->ttb[TTB_REPEAT] = Anope::Convert(ttb, -1);
if (kd->ttb[TTB_REPEAT] < 0)
{
kd->ttb[TTB_REPEAT] = 0;
source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
return;
}
kd->ttb[TTB_REPEAT] = i;
}
else
kd->ttb[TTB_REPEAT] = 0;
kd->repeattimes = 3;
try
{
kd->repeattimes = convertTo<int16_t>(times);
}
catch (const ConvertException &) { }
kd->repeattimes = Anope::Convert<int16_t>(times, -1);
if (kd->repeattimes < 1)
kd->repeattimes = 3;
+12 -21
View File
@@ -37,18 +37,13 @@ public:
Anope::string AccessSerialize() const override
{
return stringify(this->level);
return Anope::ToString(this->level);
}
void AccessUnserialize(const Anope::string &data) override
{
try
{
this->level = convertTo<int>(data);
}
catch (const ConvertException &)
{
}
if (auto l = Anope::TryConvert<int>(data))
this->level = l.value();
}
bool operator>(const ChanAccess &other) const override
@@ -95,11 +90,9 @@ class CommandCSAccess final
Privilege *p = NULL;
int level = ACCESS_INVALID;
try
{
level = convertTo<int>(params[3]);
}
catch (const ConvertException &)
if (auto lvl = Anope::TryConvert<int>(params[3]))
level = lvl.value();
else
{
p = PrivilegeManager::FindPrivilege(params[3]);
if (p != NULL && defaultLevels[p->name])
@@ -402,7 +395,7 @@ class CommandCSAccess final
}
ListFormatter::ListEntry entry;
entry["Number"] = stringify(number);
entry["Number"] = Anope::ToString(number);
entry["Level"] = access->AccessSerialize();
entry["Mask"] = access->Mask();
entry["By"] = access->creator;
@@ -442,7 +435,7 @@ class CommandCSAccess final
}
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Level"] = access->AccessSerialize();
entry["Mask"] = access->Mask();
entry["By"] = access->creator;
@@ -652,11 +645,9 @@ class CommandCSLevels final
level = ACCESS_FOUNDER;
else
{
try
{
level = convertTo<int>(lev);
}
catch (const ConvertException &)
if (auto lvl = Anope::TryConvert<int>(lev))
level = lvl.value();
else
{
this->OnSyntaxError(source, "SET");
return;
@@ -734,7 +725,7 @@ class CommandCSLevels final
else if (j == ACCESS_FOUNDER)
entry["Level"] = Language::Translate(source.GetAccount(), _("(founder only)"));
else
entry["Level"] = stringify(j);
entry["Level"] = Anope::ToString(j);
list.AddEntry(entry);
}
+2 -2
View File
@@ -311,7 +311,7 @@ class CommandCSAKick final
lastused = UNKNOWN;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(number);
entry["Number"] = Anope::ToString(number);
if (akick->nc)
entry["Mask"] = akick->nc->display;
else
@@ -351,7 +351,7 @@ class CommandCSAKick final
lastused = UNKNOWN;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
if (akick->nc)
entry["Mask"] = akick->nc->display;
else
+2 -8
View File
@@ -166,14 +166,8 @@ private:
return;
}
int l;
try
{
l = convertTo<int>(l_str);
if (l < 0)
throw ConvertException();
}
catch (const ConvertException &)
auto l = Anope::Convert<int>(l_str, -1);
if (l < 0)
{
source.Reply(_("The limit on %s is not valid."), ci->name.c_str());
return;
+9 -14
View File
@@ -123,7 +123,7 @@ private:
EntryMsg *msg = (*messages)->at(i);
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Creator"] = msg->creator;
entry["Created"] = Anope::strftime(msg->when, NULL, true);
entry["Message"] = msg->message;
@@ -162,21 +162,16 @@ private:
source.Reply(_("Entry message list for \002%s\002 is empty."), ci->name.c_str());
else
{
try
auto i = Anope::Convert<unsigned>(message, 0);
if (i > 0 && i <= (*messages)->size())
{
unsigned i = convertTo<unsigned>(message);
if (i > 0 && i <= (*messages)->size())
{
delete (*messages)->at(i - 1);
if ((*messages)->empty())
ci->Shrink<EntryMessageList>("entrymsg");
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to remove a message";
source.Reply(_("Entry message \002%i\002 for \002%s\002 deleted."), i, ci->name.c_str());
}
else
throw ConvertException();
delete (*messages)->at(i - 1);
if ((*messages)->empty())
ci->Shrink<EntryMessageList>("entrymsg");
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to remove a message";
source.Reply(_("Entry message \002%i\002 for \002%s\002 deleted."), i, ci->name.c_str());
}
catch (const ConvertException &)
else
{
source.Reply(_("Entry message \002%s\002 not found on channel \002%s\002."), message.c_str(), ci->name.c_str());
}
+1 -1
View File
@@ -331,7 +331,7 @@ class CommandCSFlags final
ListFormatter::ListEntry entry;
++count;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Mask"] = access->Mask();
entry["Flags"] = flags;
entry["Creator"] = access->creator;
+1 -1
View File
@@ -58,7 +58,7 @@ public:
if (show_all)
{
info[_("Ban type")] = stringify(ci->bantype);
info[_("Ban type")] = Anope::ToString(ci->bantype);
}
FOREACH_MOD(OnChanInfo, (source, ci, info, show_all));
+6 -6
View File
@@ -36,12 +36,10 @@ public:
sepstream(pattern.substr(1), '-').GetToken(n1, 0);
sepstream(pattern, '-').GetToken(n2, 1);
try
{
from = convertTo<int>(n1);
to = convertTo<int>(n2);
}
catch (const ConvertException &)
auto num1 = Anope::TryConvert<int>(n1);
auto num2 = Anope::TryConvert<int>(n2);
if (!num1.has_value() || !num2.has_value())
{
source.Reply(LIST_INCORRECT_RANGE);
source.Reply(_("To search for channels starting with #, search for the channel\n"
@@ -49,6 +47,8 @@ public:
return;
}
from = num1.value();
to = num2.value();
pattern = "*";
}
+1 -1
View File
@@ -135,7 +135,7 @@ public:
const LogSetting *log = (*ls)->at(i);
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Service"] = log->command_service;
entry["Command"] = !log->command_name.empty() ? log->command_name : log->service_name;
entry["Method"] = log->method;
+1 -1
View File
@@ -716,7 +716,7 @@ class CommandCSMode final
std::vector<Anope::string> new_params;
new_params.push_back(params[0]);
new_params.emplace_back("SET");
new_params.push_back("-" + stringify(cm->mchar));
new_params.push_back("-" + Anope::ToString(cm->mchar));
new_params.emplace_back("*");
this->DoSet(source, ci, new_params);
}
+7 -10
View File
@@ -165,19 +165,16 @@ public:
return;
}
try
{
int16_t new_type = convertTo<int16_t>(params[1]);
if (new_type < 0 || new_type > 3)
throw ConvertException("Invalid range");
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to change the ban type to " << new_type;
ci->bantype = new_type;
source.Reply(_("Ban type for channel %s is now #%d."), ci->name.c_str(), ci->bantype);
}
catch (const ConvertException &)
auto new_type = Anope::Convert<int16_t>(params[1], -1);
if (new_type < 0 || new_type > 3)
{
source.Reply(_("\002%s\002 is not a valid ban type."), params[1].c_str());
return;
}
Log(source.AccessFor(ci).HasPriv("SET") ? LOG_COMMAND : LOG_OVERRIDE, source, this, ci) << "to change the ban type to " << new_type;
ci->bantype = new_type;
source.Reply(_("Ban type for channel %s is now #%d."), ci->name.c_str(), ci->bantype);
}
bool OnHelp(CommandSource &source, const Anope::string &) override
+2 -2
View File
@@ -420,7 +420,7 @@ private:
return;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(Number);
entry["Number"] = Anope::ToString(Number);
entry["Mask"] = a->Mask();
entry["Description"] = a->description;
this->list.AddEntry(entry);
@@ -440,7 +440,7 @@ private:
continue;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Mask"] = a->Mask();
entry["Description"] = a->description;
list.AddEntry(entry);
+9 -18
View File
@@ -56,16 +56,7 @@ public:
template<typename Numeric>
std::enable_if_t<std::is_arithmetic_v<Numeric>, Numeric> GetNum()
{
try
{
auto token = Get();
std::stringstream stream(token.str());
Numeric ntoken = 0;
stream >> ntoken;
return ntoken;
}
catch (const ConvertException &) { }
return 0;
return Anope::Convert<Numeric>(Get(), 0);
}
// Retrieves the entire row.
@@ -869,7 +860,7 @@ private:
else if (key == "private:close:reason")
data->suspend_reason = value;
else if (key == "private:close:timestamp")
data->suspend_ts = convertTo<time_t>(value);
data->suspend_ts = Anope::Convert<time_t>(value, 0);
else if (key == "private:entrymsg")
{
auto *eml = ci->Require<EntryMessageList>("entrymsg");
@@ -891,19 +882,19 @@ private:
else if (key == "private:klinechan:reason")
data->suspend_reason = value;
else if (key == "private:klinechan:timestamp")
data->suspend_ts = convertTo<time_t>(value);
data->suspend_ts = Anope::Convert<time_t>(value, 0);
else if (key == "private:mark:reason")
data->info_message = value;
else if (key == "private:mark:setter")
data->info_adder = value;
else if (key == "private:mark:timestamp")
data->info_ts = convertTo<time_t>(value);
data->info_ts = Anope::Convert<time_t>(value, 0);
else if (key == "private:topic:setter")
ci->last_topic_setter = value;
else if (key == "private:topic:text")
ci->last_topic = value;
else if (key == "private:topic:ts")
ci->last_topic_time = convertTo<time_t>(value);
ci->last_topic_time = Anope::Convert<time_t>(value, 0);
else
Log(this) << "Unknown channel metadata " << key << " = " << value;
@@ -953,7 +944,7 @@ private:
auto kill = Config->GetModule("nickserv")->Get<time_t>("kill", "60s");
auto killquick = Config->GetModule("nickserv")->Get<time_t>("killquick", "20s");
auto secs = convertTo<unsigned>(value);
auto secs = Anope::Convert<time_t>(value, kill);
if (secs >= kill)
nc->Extend<bool>("KILLPROTECT");
else if (secs >= killquick)
@@ -966,7 +957,7 @@ private:
else if (key == "private:freeze:reason")
data->suspend_reason = value;
else if (key == "private:freeze:timestamp")
data->suspend_ts = convertTo<time_t>(value);
data->suspend_ts = Anope::Convert<time_t>(value, 0);
else if (key == "private:host:actual")
data->last_real_mask = value;
else if (key == "private:host:vhost")
@@ -978,13 +969,13 @@ private:
else if (key == "private:mark:setter")
data->info_adder = value;
else if (key == "private:mark:timestamp")
data->info_ts = convertTo<time_t>(value);
data->info_ts = Anope::Convert<time_t>(value, 0);
else if (key == "private:usercloak")
data->vhost = value;
else if (key == "private:usercloak-assigner")
data->vhost_creator = value;
else if (key == "private:usercloak-timestamp")
data->vhost_ts = convertTo<time_t>(value);
data->vhost_ts = Anope::Convert<time_t>(value, 0);
else if (key.compare(0, 18, "private:usercloak:", 18) == 0)
data->vhost_nick[key.substr(18)] = value;
else
+2 -7
View File
@@ -52,12 +52,7 @@ public:
{
if (token.find("ID ") == 0)
{
try
{
this->id = convertTo<unsigned int>(token.substr(3));
}
catch (const ConvertException &) { }
this->id = Anope::Convert(token.substr(3), 0);
continue;
}
else if (token.find("DATA ") != 0)
@@ -136,7 +131,7 @@ class DBFlatFile final
for (const auto &db : dbs)
{
const Anope::string &oldname = Anope::DataDir + "/" + db;
Anope::string newname = Anope::DataDir + "/backups/" + db + "-" + stringify(tm->tm_year + 1900) + Anope::printf("-%02i-", tm->tm_mon + 1) + Anope::printf("%02i", tm->tm_mday);
Anope::string newname = Anope::DataDir + "/backups/" + db + "-" + Anope::ToString(tm->tm_year + 1900) + Anope::printf("-%02i-", tm->tm_mon + 1) + Anope::printf("%02i", tm->tm_mday);
/* Backup already exists or no database to backup */
if (Anope::IsFile(newname) || !Anope::IsFile(oldname))
+2 -2
View File
@@ -152,7 +152,7 @@ static void process_mlock(ChannelInfo *ci, uint32_t lock, bool status, uint32_t
if (cm && ml)
{
if (limit && mlock_info.c == 'l')
ml->SetMLock(cm, status, stringify(*limit));
ml->SetMLock(cm, status, Anope::ToString(*limit));
else if (key && mlock_info.c == 'k')
ml->SetMLock(cm, status, *key);
else
@@ -889,7 +889,7 @@ static void LoadChannels()
}
}
else
access->AccessUnserialize(stringify(level));
access->AccessUnserialize(Anope::ToString(level));
}
Anope::string mask;
+20 -30
View File
@@ -162,7 +162,7 @@ public:
std::vector<Anope::string> args;
args.emplace_back("HGETALL");
args.push_back("hash:" + t->GetName() + ":" + stringify(obj->id));
args.push_back("hash:" + t->GetName() + ":" + Anope::ToString(obj->id));
/* Get object attrs to clear before updating */
redis->SendCommand(new Updater(this, t->GetName(), obj->id), args);
@@ -248,7 +248,7 @@ public:
std::vector<Anope::string> args;
args.emplace_back("HGETALL");
args.push_back("hash:" + t->GetName() + ":" + stringify(obj->id));
args.push_back("hash:" + t->GetName() + ":" + Anope::ToString(obj->id));
/* Get all of the attributes for this object */
redis->SendCommand(new Deleter(this, t->GetName(), obj->id), args);
@@ -278,19 +278,14 @@ void TypeLoader::OnResult(const Reply &r)
if (reply->type != Reply::BULK)
continue;
int64_t id;
try
{
id = convertTo<int64_t>(reply->bulk);
}
catch (const ConvertException &)
{
auto i = Anope::TryConvert<int64_t>(reply->bulk);
if (!i)
continue;
}
auto id = i.value();
std::vector<Anope::string> args;
args.emplace_back("HGETALL");
args.push_back("hash:" + this->type + ":" + stringify(id));
args.push_back("hash:" + this->type + ":" + Anope::ToString(id));
me->redis->SendCommand(new ObjectLoader(me, this->type, id), args);
}
@@ -364,7 +359,7 @@ void Deleter::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("DEL");
args.push_back("hash:" + this->type + ":" + stringify(this->id));
args.push_back("hash:" + this->type + ":" + Anope::ToString(this->id));
/* Delete hash object */
me->redis->SendCommand(NULL, args);
@@ -372,7 +367,7 @@ void Deleter::OnResult(const Reply &r)
args.clear();
args.emplace_back("SREM");
args.push_back("ids:" + this->type);
args.push_back(stringify(this->id));
args.push_back(Anope::ToString(this->id));
/* Delete id from ids set */
me->redis->SendCommand(NULL, args);
@@ -385,7 +380,7 @@ void Deleter::OnResult(const Reply &r)
args.clear();
args.emplace_back("SREM");
args.push_back("value:" + this->type + ":" + key->bulk + ":" + value->bulk);
args.push_back(stringify(this->id));
args.push_back(Anope::ToString(this->id));
/* Delete value -> object id */
me->redis->SendCommand(NULL, args);
@@ -428,7 +423,7 @@ void Updater::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SREM");
args.push_back("value:" + this->type + ":" + key->bulk + ":" + value->bulk);
args.push_back(stringify(this->id));
args.push_back(Anope::ToString(this->id));
/* Delete value -> object id */
me->redis->SendCommand(NULL, args);
@@ -438,12 +433,12 @@ void Updater::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SADD");
args.push_back("ids:" + this->type);
args.push_back(stringify(obj->id));
args.push_back(Anope::ToString(obj->id));
me->redis->SendCommand(NULL, args);
args.clear();
args.emplace_back("HMSET");
args.push_back("hash:" + this->type + ":" + stringify(obj->id));
args.push_back("hash:" + this->type + ":" + Anope::ToString(obj->id));
for (const auto &[key, value] : data.data)
{
@@ -454,7 +449,7 @@ void Updater::OnResult(const Reply &r)
args2.emplace_back("SADD");
args2.push_back("value:" + this->type + ":" + key + ":" + value->str());
args2.push_back(stringify(obj->id));
args2.push_back(Anope::ToString(obj->id));
/* Add to value -> object id set */
me->redis->SendCommand(NULL, args2);
@@ -505,16 +500,11 @@ void SubscriptionListener::OnResult(const Reply &r)
if (s_type == NULL)
return;
uint64_t obj_id;
try
{
obj_id = convertTo<uint64_t>(id);
}
catch (const ConvertException &)
{
auto oid = Anope::TryConvert<uint64_t>(id);
if (!oid.has_value())
return;
}
auto obj_id = oid.value();
if (op == "hset" || op == "hdel")
{
Serializable *s = s_type->objects[obj_id];
@@ -564,7 +554,7 @@ void SubscriptionListener::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SREM");
args.push_back("ids:" + type);
args.push_back(stringify(s->id));
args.push_back(Anope::ToString(s->id));
/* Delete object from id set */
me->redis->SendCommand(NULL, args);
@@ -604,7 +594,7 @@ void ModifiedObject::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SREM");
args.push_back("value:" + st->GetName() + ":" + key + ":" + value->str());
args.push_back(stringify(this->id));
args.push_back(Anope::ToString(this->id));
/* Delete value -> object id */
me->redis->SendCommand(NULL, args);
@@ -633,7 +623,7 @@ void ModifiedObject::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SADD");
args.push_back("value:" + st->GetName() + ":" + key + ":" + value->str());
args.push_back(stringify(obj->id));
args.push_back(Anope::ToString(obj->id));
/* Add to value -> object id set */
me->redis->SendCommand(NULL, args);
@@ -642,7 +632,7 @@ void ModifiedObject::OnResult(const Reply &r)
std::vector<Anope::string> args;
args.emplace_back("SADD");
args.push_back("ids:" + st->GetName());
args.push_back(stringify(obj->id));
args.push_back(Anope::ToString(obj->id));
/* Add to type -> id set */
me->redis->SendCommand(NULL, args);
+7 -11
View File
@@ -209,7 +209,7 @@ public:
return;
Serialize::Type *s_type = obj->GetSerializableType();
if (s_type && obj->id > 0)
this->RunBackground("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id));
this->RunBackground("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + Anope::ToString(obj->id));
this->updated_items.erase(obj);
}
@@ -240,18 +240,14 @@ public:
data[key] << value;
Serializable *obj = sb->Unserialize(NULL, data);
try
{
if (obj)
obj->id = convertTo<unsigned int>(res.Get(j, "id"));
}
catch (const ConvertException &)
{
Log(this) << "Unable to convert id for object #" << j << " of type " << sb->GetName();
}
if (obj)
{
auto oid = Anope::TryConvert<unsigned int>(res.Get(j, "id"));
if (oid.has_value())
obj->id = oid.value();
else
Log(this) << "Unable to convert id for object #" << j << " of type " << sb->GetName();
/* The Unserialize operation is destructive so rebuild the data for UpdateCache.
* Also the old data may contain columns that we don't use, so we reserialize the
* object to know for sure our cache is consistent
+7 -8
View File
@@ -163,7 +163,7 @@ public:
if (s_type)
{
if (obj->id > 0)
this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id));
this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + Anope::ToString(obj->id));
s_type->objects.erase(obj->id);
}
this->updated_items.erase(obj);
@@ -185,17 +185,16 @@ public:
{
const std::map<Anope::string, Anope::string> &row = res.Row(i);
unsigned int id;
try
{
id = convertTo<unsigned int>(res.Get(i, "id"));
}
catch (const ConvertException &)
auto oid = Anope::TryConvert<unsigned int>(res.Get(i, "id"));
if (!oid.has_value())
{
Log(LOG_DEBUG) << "Unable to convert id from " << obj->GetName();
continue;
}
auto id = oid.value();
if (res.Get(i, "timestamp").empty())
{
clear_null = true;
@@ -237,7 +236,7 @@ public:
else
{
if (!s)
this->RunQuery("UPDATE `" + prefix + obj->GetName() + "` SET `timestamp` = " + this->SQL->FromUnixtime(obj->GetTimestamp()) + " WHERE `id` = " + stringify(id));
this->RunQuery("UPDATE `" + prefix + obj->GetName() + "` SET `timestamp` = " + this->SQL->FromUnixtime(obj->GetTimestamp()) + " WHERE `id` = " + Anope::ToString(id));
else
delete s;
}
+7 -11
View File
@@ -142,19 +142,15 @@ public:
if (bcryptprovider.Compare(hash_value, req->GetPassword()))
{
unsigned long rounds = 0;
try
{
// Try to extract the rounds count to cher
pos = hash_value.find('$', 4);
if (pos == Anope::string::npos)
throw ConvertException("Malformed BCrypt hash?!");
rounds = convertTo<unsigned long>(hash_value.substr(4, pos - 4));
}
catch (const ConvertException &)
{
// Try to extract the rounds count to check if we need to
// re-encrypt the password.
pos = hash_value.find('$', 4);
if (pos != Anope::string::npos)
rounds = Anope::Convert<unsigned long>(hash_value.substr(4, pos - 4), 0);
if (!rounds)
Log(LOG_DEBUG) << "Unable to determine the rounds of a bcrypt hash: " << hash_value;
}
// If we are NOT the first encryption module or the Bcrypt rounds
// are different we want to re-encrypt the password with the primary
+2 -2
View File
@@ -452,7 +452,7 @@ Query MySQLService::BuildInsert(const Anope::string &table, unsigned int id, Dat
for (const auto &[field, _] : data.data)
query_text += ",`" + field + "`";
query_text += ") VALUES (" + stringify(id);
query_text += ") VALUES (" + Anope::ToString(id);
for (const auto &[field, _] : data.data)
query_text += ",@" + field + "@";
query_text += ") ON DUPLICATE KEY UPDATE ";
@@ -536,7 +536,7 @@ Anope::string MySQLService::BuildQuery(const Query &q)
Anope::string MySQLService::FromUnixtime(time_t t)
{
return "FROM_UNIXTIME(" + stringify(t) + ")";
return "FROM_UNIXTIME(" + Anope::ToString(t) + ")";
}
void DispatcherThread::Run()
+1 -1
View File
@@ -30,7 +30,7 @@ public:
{
PCRE2_UCHAR error[128];
pcre2_get_error_message(errcode, error, sizeof error);
throw RegexException("Error in regex " + expr + " at offset " + stringify(erroffset) + ": " + reinterpret_cast<const char*>(error));
throw RegexException("Error in regex " + expr + " at offset " + Anope::ToString(erroffset) + ": " + reinterpret_cast<const char*>(error));
}
}
+2 -2
View File
@@ -297,7 +297,7 @@ Query SQLiteService::BuildInsert(const Anope::string &table, unsigned int id, Da
query_text.erase(query_text.length() - 1);
query_text += ") VALUES (";
if (id > 0)
query_text += stringify(id) + ",";
query_text += Anope::ToString(id) + ",";
for (const auto &[field, _] : data.data)
query_text += "@" + field + "@,";
query_text.erase(query_text.length() - 1);
@@ -339,7 +339,7 @@ Anope::string SQLiteService::BuildQuery(const Query &q)
Anope::string SQLiteService::FromUnixtime(time_t t)
{
return "datetime('" + stringify(t) + "', 'unixepoch')";
return "datetime('" + Anope::ToString(t) + "', 'unixepoch')";
}
MODULE_INIT(ModuleSQLite)
+5 -8
View File
@@ -45,12 +45,9 @@ public:
source.Reply(LIST_INCORRECT_RANGE);
return;
}
try
{
from = convertTo<int>(key.substr(1, tmp - 1));
to = convertTo<int>(key.substr(tmp + 1));
}
catch (const ConvertException &) { }
from = Anope::Convert<int>(key.substr(1, tmp - 1), 0);
to = Anope::Convert<int>(key.substr(tmp + 1), 0);
}
}
@@ -70,7 +67,7 @@ public:
++display_counter;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(display_counter);
entry["Number"] = Anope::ToString(display_counter);
entry["Nick"] = na->nick;
entry["Vhost"] = na->GetVhostMask();
entry["Creator"] = na->GetVhostCreator();
@@ -88,7 +85,7 @@ public:
{
++display_counter;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(display_counter);
entry["Number"] = Anope::ToString(display_counter);
entry["Nick"] = na->nick;
entry["Vhost"] = na->GetVhostMask();
entry["Creator"] = na->GetVhostCreator();
+1 -1
View File
@@ -320,7 +320,7 @@ public:
++display_counter;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(display_counter);
entry["Number"] = Anope::ToString(display_counter);
entry["Nick"] = nick;
if (!hr->ident.empty())
entry["Vhost"] = hr->ident + "@" + hr->host;
+3 -6
View File
@@ -216,11 +216,8 @@ public:
}
else if (buf.find_ci("Content-Length: ") == 0)
{
try
{
this->content_length = convertTo<unsigned>(buf.substr(16));
}
catch (const ConvertException &ex) { }
if (auto len = Anope::TryConvert<unsigned>(buf.substr(16)))
this->content_length = len.value();
}
else if (buf.find(':') != Anope::string::npos)
{
@@ -252,7 +249,7 @@ public:
this->WriteClient("Content-Type: text/html");
else
this->WriteClient("Content-Type: " + msg->content_type);
this->WriteClient("Content-Length: " + stringify(msg->length));
this->WriteClient("Content-Length: " + Anope::ToString(msg->length));
for (const auto &cookie : msg->cookies)
{
+2 -2
View File
@@ -24,13 +24,13 @@ class MemoServCore final
subject = subject.replace_all_cs("%n", nc->display);
subject = subject.replace_all_cs("%s", m->sender);
subject = subject.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1));
subject = subject.replace_all_cs("%d", Anope::ToString(mi->GetIndex(m) + 1));
subject = subject.replace_all_cs("%t", m->text);
subject = subject.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname"));
message = message.replace_all_cs("%n", nc->display);
message = message.replace_all_cs("%s", m->sender);
message = message.replace_all_cs("%d", stringify(mi->GetIndex(m) + 1));
message = message.replace_all_cs("%d", Anope::ToString(mi->GetIndex(m) + 1));
message = message.replace_all_cs("%t", m->text);
message = message.replace_all_cs("%N", Config->GetBlock("networkinfo")->Get<const Anope::string>("networkname"));
+2 -2
View File
@@ -85,7 +85,7 @@ public:
const Memo *m = mi->GetMemo(number - 1);
ListFormatter::ListEntry entry;
entry["Number"] = (m->unread ? "* " : " ") + stringify(number);
entry["Number"] = (m->unread ? "* " : " ") + Anope::ToString(number);
entry["Sender"] = m->sender;
entry["Date/Time"] = Anope::strftime(m->time, source.GetAccount());
this->list.AddEntry(entry);
@@ -120,7 +120,7 @@ public:
const Memo *m = mi->GetMemo(i);
ListFormatter::ListEntry entry;
entry["Number"] = (m->unread ? "* " : " ") + stringify(i + 1);
entry["Number"] = (m->unread ? "* " : " ") + Anope::ToString(i + 1);
entry["Sender"] = m->sender;
entry["Date/Time"] = Anope::strftime(m->time, source.GetAccount());
list.AddEntry(entry);
+4 -12
View File
@@ -135,12 +135,8 @@ private:
else
nc->Shrink<bool>("MEMO_HARDMAX");
}
limit = -1;
try
{
limit = convertTo<int16_t>(p1);
}
catch (const ConvertException &) { }
limit = Anope::Convert<int16_t>(p1, -1);
}
else
{
@@ -160,12 +156,8 @@ private:
return;
}
int max_memos = Config->GetModule("memoserv")->Get<int>("maxmemos");
limit = -1;
try
{
limit = convertTo<int16_t>(p1);
}
catch (const ConvertException &) { }
limit = Anope::Convert<int16_t>(p1, -1);
/* The first character is a digit, but we could still go negative
* from overflow... watch out! */
if (limit < 0 || (max_memos > 0 && limit > max_memos))
+1 -1
View File
@@ -246,7 +246,7 @@ public:
int i = 0;
do
{
guestnick = guestprefix + stringify(static_cast<uint16_t>(Anope::RandomNumber()));
guestnick = guestprefix + Anope::ToString(static_cast<uint16_t>(Anope::RandomNumber()));
if (guestnick.length() > nicklen)
guestnick = guestnick.substr(0, nicklen);
}
+3 -5
View File
@@ -105,7 +105,7 @@ class CommandNSAJoin final
{
AJoinEntry *aj = (*channels)->at(i);
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Channel"] = aj->channel;
entry["Key"] = aj->key;
list.AddEntry(entry);
@@ -382,13 +382,11 @@ public:
Anope::string l;
if (c->GetParam("LIMIT", l))
{
try
if (auto limit = Anope::TryConvert<unsigned>(l))
{
unsigned limit = convertTo<unsigned>(l);
if (c->users.size() >= limit)
if (c->users.size() >= limit.value())
need_invite = true;
}
catch (const ConvertException &) { }
}
}
}
+3 -3
View File
@@ -59,7 +59,7 @@ public:
if (ci->GetFounder() == nc)
{
++chan_count;
entry["Number"] = stringify(chan_count);
entry["Number"] = Anope::ToString(chan_count);
entry["Channel"] = (ci->HasExt("CS_NO_EXPIRE") ? "!" : "") + ci->name;
entry["Access"] = Language::Translate(source.GetAccount(), _("Founder"));
entry["Description"] = ci->desc;
@@ -70,7 +70,7 @@ public:
if (ci->GetSuccessor() == nc)
{
++chan_count;
entry["Number"] = stringify(chan_count);
entry["Number"] = Anope::ToString(chan_count);
entry["Channel"] = (ci->HasExt("CS_NO_EXPIRE") ? "!" : "") + ci->name;
entry["Access"] = Language::Translate(source.GetAccount(), _("Successor"));
entry["Description"] = ci->desc;
@@ -84,7 +84,7 @@ public:
++chan_count;
entry["Number"] = stringify(chan_count);
entry["Number"] = Anope::ToString(chan_count);
entry["Channel"] = (ci->HasExt("CS_NO_EXPIRE") ? "!" : "") + ci->name;
for (auto &p : access.paths)
{
+6 -6
View File
@@ -39,17 +39,17 @@ public:
Anope::string n1, n2;
sepstream(pattern.substr(1), '-').GetToken(n1, 0);
sepstream(pattern, '-').GetToken(n2, 1);
try
{
from = convertTo<int>(n1);
to = convertTo<int>(n2);
}
catch (const ConvertException &)
auto num1 = Anope::TryConvert<int>(n1);
auto num2 = Anope::TryConvert<int>(n2);
if (!num1.has_value() || !num2.has_value())
{
source.Reply(LIST_INCORRECT_RANGE);
return;
}
from = num1.value();
to = num2.value();
pattern = "*";
}
+2 -2
View File
@@ -285,7 +285,7 @@ private:
return;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(number);
entry["Number"] = Anope::ToString(number);
entry["Mask"] = x->mask;
entry["Creator"] = x->by;
entry["Created"] = Anope::strftime(x->created, NULL, true);
@@ -307,7 +307,7 @@ private:
if (mask.empty() || mask.equals_ci(x->mask) || mask == x->id || Anope::Match(x->mask, mask, false, true))
{
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Mask"] = x->mask;
entry["Creator"] = x->by;
entry["Created"] = Anope::strftime(x->created, NULL, true);
+1 -7
View File
@@ -192,13 +192,7 @@ public:
return;
}
int newLevel = 0;
try
{
newLevel = convertTo<int>(lvl);
}
catch (const ConvertException &) { }
auto newLevel = Anope::Convert<int>(lvl, 0);
if (newLevel < 1 || newLevel > 5)
{
this->OnSyntaxError(source, "");
+12 -13
View File
@@ -42,7 +42,7 @@ struct DNSZone final
data["name"] << name;
unsigned count = 0;
for (const auto &server : servers)
data["server" + stringify(count++)] << server;
data["server" + Anope::ToString(count++)] << server;
}
static Serializable *Unserialize(Serializable *obj, Serialize::Data &data)
@@ -64,7 +64,7 @@ struct DNSZone final
for (unsigned count = 0; true; ++count)
{
Anope::string server_str;
data["server" + stringify(count)] >> server_str;
data["server" + Anope::ToString(count)] >> server_str;
if (server_str.empty())
break;
zone->servers.insert(server_str);
@@ -146,12 +146,12 @@ public:
{
data["server_name"] << server_name;
for (unsigned i = 0; i < ips.size(); ++i)
data["ip" + stringify(i)] << ips[i];
data["ip" + Anope::ToString(i)] << ips[i];
data["limit"] << limit;
data["pooled"] << pooled;
unsigned count = 0;
for (const auto &zone : zones)
data["zone" + stringify(count++)] << zone;
data["zone" + Anope::ToString(count++)] << zone;
}
static Serializable *Unserialize(Serializable *obj, Serialize::Data &data)
@@ -172,7 +172,7 @@ public:
for (unsigned i = 0; true; ++i)
{
Anope::string ip_str;
data["ip" + stringify(i)] >> ip_str;
data["ip" + Anope::ToString(i)] >> ip_str;
if (ip_str.empty())
break;
req->ips.push_back(ip_str);
@@ -185,7 +185,7 @@ public:
for (unsigned i = 0; true; ++i)
{
Anope::string zone_str;
data["zone" + stringify(i)] >> zone_str;
data["zone" + Anope::ToString(i)] >> zone_str;
if (zone_str.empty())
break;
req->zones.insert(zone_str);
@@ -225,7 +225,7 @@ class CommandOSDNS final
ListFormatter::ListEntry entry;
entry["Server"] = s->GetName();
entry["Limit"] = s->GetLimit() ? stringify(s->GetLimit()) : Language::Translate(source.GetAccount(), _("None"));
entry["Limit"] = s->GetLimit() ? Anope::ToString(s->GetLimit()) : Language::Translate(source.GetAccount(), _("None"));
Anope::string ip_str;
for (const auto &ip : s->GetIPs())
@@ -579,16 +579,15 @@ class CommandOSDNS final
if (params[2].equals_ci("LIMIT"))
{
try
if (auto l = Anope::TryConvert<unsigned>(params[3]))
{
unsigned l = convertTo<unsigned>(params[3]);
s->SetLimit(l);
if (l)
source.Reply(_("User limit for %s set to %d."), s->GetName().c_str(), l);
s->SetLimit(l.value());
if (s->GetLimit())
source.Reply(_("User limit for %s set to %d."), s->GetName().c_str(), s->GetLimit());
else
source.Reply(_("User limit for %s removed."), s->GetName().c_str());
}
catch (const ConvertException &ex)
else
{
source.Reply(_("Invalid value for LIMIT. Must be numerical."));
}
+2 -2
View File
@@ -60,7 +60,7 @@ public:
ListFormatter::ListEntry entry;
entry["Name"] = cc->chan->name;
entry["Users"] = stringify(cc->chan->users.size());
entry["Users"] = Anope::ToString(cc->chan->users.size());
entry["Modes"] = cc->chan->GetModes(true, true);
entry["Topic"] = cc->chan->topic;
list.AddEntry(entry);
@@ -87,7 +87,7 @@ public:
ListFormatter::ListEntry entry;
entry["Name"] = c->name;
entry["Users"] = stringify(c->users.size());
entry["Users"] = Anope::ToString(c->users.size());
entry["Modes"] = c->GetModes(true, true);
entry["Topic"] = c->topic;
list.AddEntry(entry);
+8 -18
View File
@@ -47,32 +47,22 @@ public:
if (params[i].length() > 2)
{
Anope::string dur = params[i].substr(1, params[i].length() - 2);
try
{
days = convertTo<int>(dur);
if (days <= 0)
throw ConvertException();
}
catch (const ConvertException &)
{
auto d = Anope::Convert<int>(dur, 0);
if (d > 0)
days = d;
else
source.Reply(_("Invalid duration %s, using %d days."), dur.c_str(), days);
}
}
break;
case 'l':
if (params[i].length() > 2)
{
Anope::string dur = params[i].substr(1, params[i].length() - 2);
try
{
replies = convertTo<int>(dur);
if (replies <= 0)
throw ConvertException();
}
catch (const ConvertException &)
{
auto r = Anope::Convert<int>(dur, 0);
if (r > 0)
replies = r;
else
source.Reply(_("Invalid limit %s, using %d."), dur.c_str(), replies);
}
}
break;
default:
+7 -11
View File
@@ -168,7 +168,7 @@ protected:
for (unsigned i = 0, end = list.size(); i < end; ++i)
{
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Creator"] = list[i]->who;
entry["Created"] = Anope::strftime(list[i]->time, NULL, true);
entry["Text"] = list[i]->text;
@@ -232,18 +232,14 @@ protected:
source.Reply(READ_ONLY_MODE);
if (!text.equals_ci("ALL"))
{
try
unsigned num = Anope::Convert<unsigned>(text, 0);
if (num > 0 && num <= list.size())
{
unsigned num = convertTo<unsigned>(text);
if (num > 0 && num <= list.size())
{
this->ns->DelNewsItem(list[num - 1]);
source.Reply(msgs[MSG_DELETED], num);
Log(LOG_ADMIN, source, this) << "to delete a news item";
return;
}
this->ns->DelNewsItem(list[num - 1]);
source.Reply(msgs[MSG_DELETED], num);
Log(LOG_ADMIN, source, this) << "to delete a news item";
return;
}
catch (const ConvertException &) { }
source.Reply(msgs[MSG_DEL_NOT_FOUND], text.c_str());
}
+7 -19
View File
@@ -178,13 +178,7 @@ private:
{
Anope::string param = params[1];
unsigned mincount = 0;
try
{
mincount = convertTo<unsigned>(param);
}
catch (const ConvertException &) { }
auto mincount = Anope::Convert<unsigned>(param, 0);
if (mincount <= 1)
source.Reply(_("Invalid threshold value. It must be a valid integer greater than 1."));
else
@@ -197,7 +191,7 @@ private:
if (session->count >= mincount)
{
ListFormatter::ListEntry entry;
entry["Session"] = stringify(session->count);
entry["Session"] = Anope::ToString(session->count);
entry["Host"] = session->addr.mask();
list.AddEntry(entry);
}
@@ -327,13 +321,7 @@ private:
else if (expires > 0)
expires += Anope::CurTime;
unsigned limit = -1;
try
{
limit = convertTo<unsigned>(limitstr);
}
catch (const ConvertException &) { }
auto limit = Anope::Convert<unsigned>(limitstr, -1);
if (limit > max_exception_limit)
{
source.Reply(_("Invalid session limit. It must be a valid integer greater than or equal to zero and less than \002%d\002."), max_exception_limit);
@@ -453,12 +441,12 @@ private:
Exception *e = session_service->GetExceptions()[Number - 1];
ListFormatter::ListEntry entry;
entry["Number"] = stringify(Number);
entry["Number"] = Anope::ToString(Number);
entry["Mask"] = e->mask;
entry["By"] = e->who;
entry["Created"] = Anope::strftime(e->time, NULL, true);
entry["Expires"] = Anope::Expires(e->expires, source.GetAccount());
entry["Limit"] = stringify(e->limit);
entry["Limit"] = Anope::ToString(e->limit);
entry["Reason"] = e->reason;
this->list.AddEntry(entry);
}
@@ -474,12 +462,12 @@ private:
if (mask.empty() || Anope::Match(e->mask, mask))
{
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Mask"] = e->mask;
entry["By"] = e->who;
entry["Created"] = Anope::strftime(e->time, NULL, true);
entry["Expires"] = Anope::Expires(e->expires, source.GetAccount());
entry["Limit"] = stringify(e->limit);
entry["Limit"] = Anope::ToString(e->limit);
entry["Reason"] = e->reason;
list.AddEntry(entry);
}
+3 -3
View File
@@ -122,14 +122,14 @@ private:
}
else
{
try
auto debug = Anope::TryConvert<int>(setting);
if (debug.has_value())
{
Anope::Debug = convertTo<int>(setting);
Anope::Debug = debug.value();
Log(LOG_ADMIN, source, this) << "DEBUG " << Anope::Debug;
source.Reply(_("Services are now in \002debug\002 mode (level %d)."), Anope::Debug);
return;
}
catch (const ConvertException &) { }
source.Reply(_("Setting for DEBUG must be \002ON\002, \002OFF\002, or a positive number."));
}
+2 -2
View File
@@ -142,7 +142,7 @@ private:
return;
ListFormatter::ListEntry entry;
entry["Number"] = stringify(number);
entry["Number"] = Anope::ToString(number);
entry["Mask"] = x->mask;
entry["By"] = x->by;
entry["Created"] = Anope::strftime(x->created, NULL, true);
@@ -164,7 +164,7 @@ private:
if (mask.empty() || mask.equals_ci(x->mask) || mask == x->id || Anope::Match(x->mask, mask, false, true))
{
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Number"] = Anope::ToString(i + 1);
entry["Mask"] = x->mask;
entry["By"] = x->by;
entry["Created"] = Anope::strftime(x->created, NULL, true);
+16 -22
View File
@@ -19,15 +19,15 @@ public:
bool IsValid(Anope::string &value) const override
{
try
{
Anope::string rest;
if (!value.empty() && value[0] != ':' && convertTo<int>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<int>(rest.substr(1), rest, false) > 0 && rest.empty())
return true;
}
catch (const ConvertException &) { }
if (value.empty() || value[0] == ':')
return false;
return false;
Anope::string rest;
auto num1 = Anope::Convert<int>(value[0] == '*' ? value.substr(1) : value, 0, &rest);
if (num1 <= 0 || rest[0] != ':' || rest.length() <= 1)
return false;
return Anope::Convert<int>(rest.substr(1), 0, &rest) > 0 && rest.empty();
}
};
@@ -52,7 +52,7 @@ public:
if (Servers::Capab.count("TSMODE") > 0)
{
auto params = values;
params.insert(params.begin(), { chan->name, stringify(chan->creation_time), modes });
params.insert(params.begin(), { chan->name, Anope::ToString(chan->creation_time), modes });
Uplink::SendInternal({}, source, "MODE", params);
}
else
@@ -62,7 +62,7 @@ public:
void SendModeInternal(const MessageSource &source, User *u, const Anope::string &modes, const std::vector<Anope::string> &values) override
{
auto params = values;
params.insert(params.begin(), { u->nick, stringify(u->timestamp), modes });
params.insert(params.begin(), { u->nick, Anope::ToString(u->timestamp), modes });
Uplink::SendInternal({}, source, "SVSMODE", params);
}
@@ -323,13 +323,7 @@ struct IRCDMessageMode final
if (params.size() > 2 && IRCD->IsChannelValid(params[0]))
{
Channel *c = Channel::Find(params[0]);
time_t ts = 0;
try
{
ts = convertTo<time_t>(params[1]);
}
catch (const ConvertException &) { }
auto ts = Anope::Convert<time_t>(params[1], 0);
Anope::string modes = params[2];
for (unsigned int i = 3; i < params.size(); ++i)
@@ -382,8 +376,8 @@ struct IRCDMessageNick final
}
NickAlias *na = NULL;
time_t signon = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0,
stamp = params[7].is_pos_number_only() ? convertTo<time_t>(params[7]) : 0;
auto signon = Anope::Convert<time_t>(params[2], 0);
auto stamp = Anope::Convert<time_t>(params[7], 0);
if (signon && signon == stamp)
na = NickAlias::Find(params[0]);
@@ -406,7 +400,7 @@ struct IRCDMessageServer final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
unsigned int hops = Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0;
auto hops = Anope::Convert<unsigned>(params[1], 0);
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], hops, params[2]);
}
};
@@ -463,7 +457,7 @@ struct IRCDMessageSJoin final
}
}
time_t ts = Anope::string(params[0]).is_pos_number_only() ? convertTo<time_t>(params[0]) : Anope::CurTime;
auto ts = Anope::Convert<time_t>(params[0], Anope::CurTime);
Message::Join::SJoin(source, params[1], ts, modes, users);
}
};
@@ -477,7 +471,7 @@ struct IRCDMessageTopic final
{
Channel *c = Channel::Find(params[0]);
if (c)
c->ChangeTopicInternal(source.GetUser(), params[1], params[3], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime);
c->ChangeTopicInternal(source.GetUser(), params[1], params[3], Anope::Convert<time_t>(params[2], Anope::CurTime));
}
};
+8 -16
View File
@@ -203,7 +203,7 @@ public:
void SendModeInternal(const MessageSource &source, User *u, const Anope::string &modes, const std::vector<Anope::string> &values) override
{
auto params = values;
params.insert(params.begin(), { u->GetUID(), stringify(u->timestamp), modes });
params.insert(params.begin(), { u->GetUID(), Anope::ToString(u->timestamp), modes });
Uplink::SendInternal({}, source, "SVSMODE", params);
}
@@ -468,7 +468,7 @@ struct IRCDMessageNick final
/* :0MCAAAAAB NICK newnick 1350157102 */
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
source.GetUser()->ChangeNick(params[0], convertTo<time_t>(params[1]));
source.GetUser()->ChangeNick(params[0], Anope::Convert<time_t>(params[1], Anope::CurTime));
}
};
@@ -531,7 +531,7 @@ struct IRCDMessageSID final
/* :0MC SID hades.arpa 2 4XY + :ircd-hybrid test server */
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
unsigned int hops = params[1].is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0;
auto hops = Anope::Convert(params[1], 0);
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], hops, params.back(), params[2]);
IRCD->SendPing(Me->GetName(), params[0]);
@@ -581,7 +581,7 @@ struct IRCDMessageSJoin final
users.push_back(sju);
}
time_t ts = Anope::string(params[0]).is_pos_number_only() ? convertTo<time_t>(params[0]) : Anope::CurTime;
auto ts = Anope::Convert<time_t>(params[0], Anope::CurTime);
Message::Join::SJoin(source, params[1], ts, modes, users);
}
};
@@ -600,7 +600,7 @@ struct IRCDMessageSVSMode final
if (!u)
return;
if (!params[1].is_pos_number_only() || convertTo<time_t>(params[1]) != u->timestamp)
if (Anope::Convert<time_t>(params[1], 0) != u->timestamp)
return;
u->SetModesInternal(source, params[2]);
@@ -618,7 +618,7 @@ struct IRCDMessageTBurst final
{
Anope::string setter;
sepstream(params[3], '!').GetToken(setter, 0);
time_t topic_time = Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime;
auto topic_time = Anope::Convert<time_t>(params[2], Anope::CurTime);
Channel *c = Channel::Find(params[1]);
if (c)
@@ -635,14 +635,7 @@ struct IRCDMessageTMode final
/* :0MC TMODE 1654867975 #nether +ntR */
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
time_t ts = 0;
try
{
ts = convertTo<time_t>(params[0]);
}
catch (const ConvertException &) { }
auto ts = Anope::Convert<time_t>(params[0], 0);
Channel *c = Channel::Find(params[1]);
Anope::string modes = params[2];
@@ -670,8 +663,7 @@ struct IRCDMessageUID final
/* Source is always the server */
User::OnIntroduce(params[0], params[4], params[6], params[5], params[7], source.GetServer(), params[10],
params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0,
params[3], params[8], na ? *na->nc : NULL);
Anope::Convert<time_t>(params[2], 0), params[3], params[8], na ? *na->nc : NULL);
}
};
+30 -73
View File
@@ -130,7 +130,7 @@ private:
static void SendAccount(const Anope::string &uid, NickAlias *na)
{
Uplink::Send("METADATA", uid, "accountid", na ? na->nc->GetId() : Anope::string());
Uplink::Send("METADATA", uid, "accountid", na ? Anope::ToString(na->nc->GetId()) : Anope::string());
Uplink::Send("METADATA", uid, "accountname", na ? na->nc->display : Anope::string());
if (spanningtree_proto_ver >= 1206)
Uplink::Send("METADATA", uid, "accountnicks", GetAccountNicks(na));
@@ -401,14 +401,14 @@ public:
void SendNumericInternal(int numeric, const Anope::string &dest, const std::vector<Anope::string> &params) override
{
auto newparams = params;
newparams.insert(newparams.begin(), { Me->GetSID(), dest, stringify(numeric) });
newparams.insert(newparams.begin(), { Me->GetSID(), dest, Anope::ToString(numeric) });
Uplink::SendInternal({}, Me, "NUM", newparams);
}
void SendModeInternal(const MessageSource &source, Channel *chan, const Anope::string &modes, const std::vector<Anope::string> &values) override
{
auto params = values;
params.insert(params.begin(), { chan->name, stringify(chan->creation_time), modes });
params.insert(params.begin(), { chan->name, Anope::ToString(chan->creation_time), modes });
Uplink::SendInternal({}, source, "FMODE", params);
}
@@ -923,32 +923,20 @@ public:
return false; // no ':' or it's the first char, both are invalid
Anope::string rest;
try
if (Anope::Convert<int>(value, 0, &rest) <= 0)
return false; // negative numbers and zero are invalid
rest = rest.substr(1);
if (historymode)
{
if (convertTo<int>(value, rest, false) <= 0)
return false; // negative numbers and zero are invalid
rest = rest.substr(1);
int n;
if (historymode)
{
// For the history mode, the part after the ':' is a duration and it
// can be in the user friendly "1d3h20m" format, make sure we accept that
n = Anope::DoTime(rest);
}
else
n = convertTo<int>(rest);
if (n <= 0)
return false;
// For the history mode, the part after the ':' is a duration and it
// can be in the user friendly "1d3h20m" format, make sure we accept that
return Anope::DoTime(rest) <= 0;
}
catch (const ConvertException &e)
else
{
// conversion error, invalid
return false;
return Anope::Convert(rest, 0) <= 0;
}
return true;
}
};
@@ -963,18 +951,7 @@ public:
if (value.empty())
return false; // empty param is never valid
try
{
if (convertTo<int>(value) <= 0)
return false;
}
catch (const ConvertException &e)
{
// conversion error, invalid
return false;
}
return true;
return Anope::Convert<int>(value, 0) <= 0;
}
};
@@ -1068,15 +1045,15 @@ struct IRCDMessageCapab final
static std::pair<Anope::string, size_t> ParseCapability(const Anope::string &token)
{
auto sep = token.find(':');
auto sep = token.find('=');
if (sep == Anope::string::npos)
return { token, 0 };
auto value = token.substr(sep);
auto value = token.substr(sep + 1);
if (!value.is_pos_number_only())
return { token, 0 };
return { token.substr(0, sep), convertTo<size_t>(value) };
return { token.substr(0, sep), Anope::Convert<size_t>(value, 0) };
}
static bool ParseExtBan(const Anope::string &token, ExtBanInfo &extban)
@@ -1117,7 +1094,7 @@ struct IRCDMessageCapab final
return false;
const Anope::string modelevel = token.substr(a + 1, b - a - 1);
mode.level = modelevel.is_pos_number_only() ? convertTo<unsigned>(modelevel) : 0;
mode.level = Anope::Convert<unsigned>(modelevel, 0);
a = b;
}
@@ -1159,7 +1136,7 @@ struct IRCDMessageCapab final
{
spanningtree_proto_ver = 0;
if (params.size() >= 2)
spanningtree_proto_ver = params[1].is_pos_number_only() ? convertTo<size_t>(params[1]) : 0;
spanningtree_proto_ver = Anope::Convert<size_t>(params[1], 0);
if (spanningtree_proto_ver < 1205)
{
@@ -1769,18 +1746,8 @@ struct IRCDMessageSave final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
User *targ = User::Find(params[0]);
time_t ts;
try
{
ts = convertTo<time_t>(params[1]);
}
catch (const ConvertException &)
{
return;
}
if (!targ || targ->timestamp != ts)
auto ts = Anope::Convert<time_t>(params[1], 0);
if (!targ || !ts || targ->timestamp != ts)
return;
BotInfo *bi;
@@ -1847,7 +1814,7 @@ public:
Anope::string modechr, modelimit;
while (limitstream.GetToken(modechr) && limitstream.GetToken(modelimit))
{
limits.emplace(modechr[0], convertTo<unsigned>(modelimit));
limits.emplace(modechr[0], Anope::Convert<unsigned>(modelimit, 0));
}
maxlist.Set(c, limits);
}
@@ -2048,7 +2015,7 @@ struct IRCDMessageFJoin final
users.push_back(sju);
}
time_t ts = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : Anope::CurTime;
auto ts = Anope::Convert<time_t>(params[0], Anope::CurTime);
Message::Join::SJoin(source, params[0], ts, modes, users);
}
};
@@ -2067,17 +2034,7 @@ struct IRCDMessageFMode final
modes += " " + params[n];
Channel *c = Channel::Find(params[0]);
time_t ts;
try
{
ts = convertTo<time_t>(params[1]);
}
catch (const ConvertException &)
{
ts = 0;
}
auto ts = Anope::Convert<time_t>(params[1], 0);
if (c)
c->SetModesInternal(source, modes, ts);
}
@@ -2098,7 +2055,7 @@ struct IRCDMessageFTopic final
Channel *c = Channel::Find(params[0]);
if (c)
c->ChangeTopicInternal(NULL, setby, topic, params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime);
c->ChangeTopicInternal(NULL, setby, topic, Anope::Convert<time_t>(params[2], Anope::CurTime));
}
};
@@ -2147,7 +2104,7 @@ struct IRCDMessageIJoin final
time_t chants = Anope::CurTime;
if (params.size() >= 4)
{
chants = params[2].is_pos_number_only() ? convertTo<unsigned>(params[2]) : 0;
chants = Anope::Convert<time_t>(params[2], 0);
for (auto mode : params[3])
user.first.AddMode(mode);
}
@@ -2175,7 +2132,7 @@ struct IRCDMessageLMode final
return; // Channel doesn't exist.
// If the TS is greater than ours, we drop the mode and don't pass it anywhere.
auto chants = convertTo<time_t>(params[1]);
auto chants = Anope::Convert<time_t>(params[1], Anope::CurTime);
if (chants > chan->creation_time)
return;
@@ -2307,7 +2264,7 @@ struct IRCDMessageServer final
* 3: numeric
* 4: desc
*/
unsigned int hops = Anope::string(params[2]).is_pos_number_only() ? convertTo<unsigned>(params[2]) : 0;
auto hops = Anope::Convert<unsigned>(params[2], 0);
new Server(Me, params[0], hops, params[4], params[3]);
}
else if (source.GetServer())
@@ -2380,7 +2337,7 @@ struct IRCDMessageUID final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
size_t offset = params[9][0] == '+' ? 1 : 0;
time_t ts = convertTo<time_t>(params[1]);
time_t ts = Anope::Convert<time_t>(params[1], 0);
Anope::string modes = params[8];
for (unsigned i = 9; i < params.size() - 1; ++i)
@@ -2405,7 +2362,7 @@ struct IRCDMessageUID final
User *u = User::OnIntroduce(params[2], params[5+offset], params[3], params[4], params[6+offset], source.GetServer(), params[params.size() - 1], ts, modes, params[0], na ? *na->nc : NULL);
if (u)
u->signon = convertTo<time_t>(params[7+offset]);
u->signon = Anope::Convert<time_t>(params[7+offset], 0);
}
};
+3 -4
View File
@@ -178,12 +178,11 @@ struct IRCDMessage005 final
data = param.substr(pos+1, param.length());
if (parameter == "MODES")
{
unsigned maxmodes = convertTo<unsigned>(data);
IRCD->MaxModes = maxmodes;
IRCD->MaxModes = Anope::Convert<unsigned>(data, IRCD->MaxModes);
}
else if (parameter == "NICKLEN")
{
nicklen = data.is_pos_number_only() ? convertTo<size_t>(data) : 0;
nicklen = Anope::Convert<size_t>(data, 0);
}
}
}
@@ -557,7 +556,7 @@ struct IRCDMessageServer final
else
{
// our uplink is introducing a new server
unsigned int hops = params[1].is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0;
auto hops = Anope::Convert<unsigned>(params[1], 0);
new Server(source.GetServer(), params[0], hops, params[3], params[2]);
}
/*
+5 -17
View File
@@ -144,7 +144,7 @@ public:
void SendModeInternal(const MessageSource &source, User *u, const Anope::string &modes, const std::vector<Anope::string> &values) override
{
auto params = values;
params.insert(params.begin(), { "*", "SVSMODE", u->GetUID(), stringify(u->timestamp), modes });
params.insert(params.begin(), { "*", "SVSMODE", u->GetUID(), Anope::ToString(u->timestamp), modes });
Uplink::SendInternal({}, source, "ENCAP", params);
}
@@ -306,23 +306,11 @@ struct IRCDMessageUID final
if (ip == "0")
ip.clear();
time_t ts;
try
{
ts = convertTo<time_t>(params[2]);
}
catch (const ConvertException &)
{
ts = Anope::CurTime;
}
auto ts = Anope::Convert<time_t>(params[2], Anope::CurTime);
NickAlias *na = NULL;
try
{
if (params[8].is_pos_number_only() && convertTo<time_t>(params[8]) == ts)
na = NickAlias::Find(params[0]);
}
catch (const ConvertException &) { }
if (Anope::Convert<time_t>(params[8], 0) == ts)
na = NickAlias::Find(params[0]);
if (params[8] != "0" && !na)
na = NickAlias::Find(params[8]);
+2 -2
View File
@@ -228,7 +228,7 @@ struct IRCDMessageTBurst final
*/
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
time_t topic_time = Anope::string(params[1]).is_pos_number_only() ? convertTo<time_t>(params[1]) : Anope::CurTime;
auto topic_time = Anope::Convert<time_t>(params[1], Anope::CurTime);
Channel *c = Channel::Find(params[0]);
if (!c)
@@ -250,7 +250,7 @@ struct IRCDMessageUID final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
/* Source is always the server */
User::OnIntroduce(params[0], params[4], params[5], "", params[6], source.GetServer(), params[8], params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0, params[3], params[7], NULL);
User::OnIntroduce(params[0], params[4], params[5], "", params[6], source.GetServer(), params[8], Anope::Convert<time_t>(params[2], 0), params[3], params[7], NULL);
}
};
+1 -1
View File
@@ -254,7 +254,7 @@ struct IRCDMessageEUID final
if (params[9] != "*")
na = NickAlias::Find(params[9]);
User::OnIntroduce(params[0], params[4], (params[8] != "*" ? params[8] : params[5]), params[5], params[6], source.GetServer(), params[10], params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime, params[3], params[7], na ? *na->nc : NULL);
User::OnIntroduce(params[0], params[4], (params[8] != "*" ? params[8] : params[5]), params[5], params[6], source.GetServer(), params[10], Anope::Convert<time_t>(params[2], Anope::CurTime), params[3], params[7], na ? *na->nc : NULL);
}
};
+28 -63
View File
@@ -675,15 +675,16 @@ public:
/* Borrowed part of this check from UnrealIRCd */
bool IsValid(Anope::string &value) const override
{
if (value.empty())
if (value.empty() || value[0] == ':')
return false;
try
{
Anope::string rest;
if (value[0] != ':' && convertTo<unsigned>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<unsigned>(rest.substr(1), rest, false) > 0 && rest.empty())
return true;
}
catch (const ConvertException &) { }
Anope::string rest;
auto num1 = Anope::Convert<unsigned>(value[0] == '*' ? value.substr(1) : value, 0, &rest);
if (!num1 || rest[0] != ':' || rest.length() <= 1)
return false;
if (Anope::Convert<int>(rest.substr(1), 0, &rest) > 0 && rest.empty())
return true;
/* '['<number><1 letter>[optional: '#'+1 letter],[next..]']'':'<number> */
size_t end_bracket = value.find(']', 1);
@@ -702,16 +703,10 @@ public:
++p;
if (p == arg.length() || (arg[p] != 'c' && arg[p] != 'j' && arg[p] != 'k' && arg[p] != 'm' && arg[p] != 'n' && arg[p] != 't'))
continue; /* continue instead of break for forward compatibility. */
try
{
int v = arg.substr(0, p).is_number_only() ? convertTo<int>(arg.substr(0, p)) : 0;
if (v < 1 || v > 999)
return false;
}
catch (const ConvertException &)
{
auto v = Anope::Convert<int>(arg.substr(0, p), 0);
if (v < 1 || v > 999)
return false;
}
}
return true;
@@ -734,27 +729,14 @@ public:
return false; // no ':' or it's the first char, both are invalid
Anope::string rest;
try
{
if (convertTo<int>(value, rest, false) <= 0)
return false; // negative numbers and zero are invalid
if (Anope::Convert<int>(value, 0, &rest) <= 0)
return false; // negative numbers and zero are invalid
rest = rest.substr(1);
int n;
// The part after the ':' is a duration and it
// can be in the user friendly "1d3h20m" format, make sure we accept that
n = Anope::DoTime(rest);
if (n <= 0)
return false;
}
catch (const ConvertException &e)
{
// conversion error, invalid
// The part after the ':' is a duration and it
// can be in the user friendly "1d3h20m" format, make sure we accept that
auto n = Anope::DoTime(rest.substr(1));
return n <= 0;
return false;
}
return true;
}
};
@@ -1177,14 +1159,7 @@ struct IRCDMessageMode final
if (IRCD->IsChannelValid(params[0]))
{
Channel *c = Channel::Find(params[0]);
time_t ts = 0;
try
{
if (server_source)
ts = convertTo<time_t>(params[params.size() - 1]);
}
catch (const ConvertException &) { }
auto ts = Anope::Convert<time_t>(params[params.size() - 1], 0);
if (c)
c->SetModesInternal(source, modes, ts);
@@ -1215,7 +1190,7 @@ struct IRCDMessageNetInfo final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
Uplink::Send("NETINFO", MaxUserCount, Anope::CurTime, convertTo<int>(params[2]), params[3], 0, 0, 0, params[7]);
Uplink::Send("NETINFO", MaxUserCount, Anope::CurTime, params[2], params[3], 0, 0, 0, params[7]);
}
};
@@ -1263,8 +1238,7 @@ struct IRCDMessageNick final
if (vhost.equals_cs("*"))
vhost.clear();
time_t user_ts = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime;
auto user_ts = Anope::Convert<time_t>(params[2], Anope::CurTime);
Server *s = Server::Find(params[5]);
if (s == NULL)
{
@@ -1278,7 +1252,7 @@ struct IRCDMessageNick final
;
else if (params[6].is_pos_number_only())
{
if (convertTo<time_t>(params[6]) == user_ts)
if (Anope::Convert<time_t>(params[6], 0) == user_ts)
na = NickAlias::Find(params[0]);
}
else
@@ -1398,7 +1372,7 @@ struct IRCDMessageServer final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
unsigned int hops = Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0;
auto hops = Anope::Convert<unsigned>(params[1], 0);
if (params[1].equals_cs("1"))
{
@@ -1421,7 +1395,7 @@ struct IRCDMessageSID final
void Run(MessageSource &source, const std::vector<Anope::string> &params, const Anope::map<Anope::string> &tags) override
{
unsigned int hops = Anope::string(params[1]).is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0;
auto hops = Anope::Convert<unsigned>(params[1], 0);
new Server(source.GetServer(), params[0], hops, params[3], params[2]);
@@ -1503,7 +1477,7 @@ struct IRCDMessageSJoin final
}
}
time_t ts = Anope::string(params[0]).is_pos_number_only() ? convertTo<time_t>(params[0]) : Anope::CurTime;
auto ts = Anope::Convert<time_t>(params[0], Anope::CurTime);
Message::Join::SJoin(source, params[1], ts, modes, users);
if (!bans.empty() || !excepts.empty() || !invites.empty())
@@ -1582,7 +1556,7 @@ struct IRCDMessageTopic final
{
Channel *c = Channel::Find(params[0]);
if (c)
c->ChangeTopicInternal(source.GetUser(), params[1], params[3], Anope::string(params[2]).is_pos_number_only() ? convertTo<time_t>(params[2]) : Anope::CurTime);
c->ChangeTopicInternal(source.GetUser(), params[1], params[3], Anope::Convert<time_t>(params[2], Anope::CurTime));
}
};
@@ -1637,16 +1611,7 @@ struct IRCDMessageUID final
if (chost == "*")
chost.clear();
time_t user_ts;
try
{
user_ts = convertTo<time_t>(timestamp);
}
catch (const ConvertException &)
{
user_ts = Anope::CurTime;
}
auto user_ts = Anope::Convert<time_t>(timestamp, Anope::CurTime);
NickAlias *na = NULL;
if (account == "0")
@@ -1655,7 +1620,7 @@ struct IRCDMessageUID final
}
else if (account.is_pos_number_only())
{
if (convertTo<time_t>(account) == user_ts)
if (Anope::Convert<time_t>(account, 0) == user_ts)
na = NickAlias::Find(nickname);
}
else
+3 -7
View File
@@ -88,7 +88,7 @@ protected:
reason = reason.replace_all_cs("%t", this->GetType());
reason = reason.replace_all_cs("%i", this->conaddr.addr());
reason = reason.replace_all_cs("%p", stringify(this->conaddr.port()));
reason = reason.replace_all_cs("%p", Anope::ToString(this->conaddr.port()));
BotInfo *OperServ = Config->GetClient("OperServ");
Log(OperServ) << "PROXYSCAN: Open " << this->GetType() << " proxy found on " << this->conaddr.str() << " (" << reason << ")";
@@ -321,12 +321,8 @@ public:
commasepstream sep2(block->Get<const Anope::string>("port"));
while (sep2.GetToken(token))
{
try
{
unsigned short port = convertTo<unsigned short>(token);
p.ports.push_back(port);
}
catch (const ConvertException &) { }
if (auto port = Anope::TryConvert<unsigned short>(token))
p.ports.push_back(port.value());
}
if (p.ports.empty())
continue;
+9 -18
View File
@@ -127,13 +127,13 @@ private:
std::vector<char> buffer;
Pack(buffer, "*");
Pack(buffer, stringify(args.size()).c_str());
Pack(buffer, Anope::ToString(args.size()).c_str());
Pack(buffer, "\r\n");
for (const auto &[key, value] : args)
{
Pack(buffer, "$");
Pack(buffer, stringify(value).c_str());
Pack(buffer, Anope::ToString(value).c_str());
Pack(buffer, "\r\n");
Pack(buffer, key, value);
@@ -278,7 +278,7 @@ void RedisSocket::OnConnect()
Log() << "redis: Successfully connected to " << provider->name << (this == this->provider->sub ? " (sub)" : "");
this->provider->SendCommand(NULL, "CLIENT SETNAME Anope");
this->provider->SendCommand(NULL, "SELECT " + stringify(provider->db));
this->provider->SendCommand(NULL, "SELECT " + Anope::ToString(provider->db));
if (this != this->provider->sub)
{
@@ -333,11 +333,8 @@ size_t RedisSocket::ParseReply(Reply &r, const char *buffer, size_t l)
size_t nl = ibuf.find("\r\n");
if (nl != Anope::string::npos)
{
try
{
r.i = convertTo<int64_t>(ibuf.substr(0, nl));
}
catch (const ConvertException &) { }
if (auto i = Anope::TryConvert<int64_t>(ibuf.substr(0, nl)))
r.i = i.value();
r.type = Reply::INT;
used = 1 + nl + 2;
@@ -351,10 +348,9 @@ size_t RedisSocket::ParseReply(Reply &r, const char *buffer, size_t l)
size_t nl = reply.find("\r\n");
if (nl != Anope::string::npos)
{
int len;
try
if (auto l = Anope::TryConvert<int>(reply.substr(0, nl)))
{
len = convertTo<int>(reply.substr(0, nl));
int len = l.value();
if (len >= 0)
{
if (1 + nl + 2 + len + 2 <= l)
@@ -370,7 +366,6 @@ size_t RedisSocket::ParseReply(Reply &r, const char *buffer, size_t l)
r.type = Reply::BULK;
}
}
catch (const ConvertException &) { }
}
break;
}
@@ -384,12 +379,8 @@ size_t RedisSocket::ParseReply(Reply &r, const char *buffer, size_t l)
if (nl != Anope::string::npos)
{
r.type = Reply::MULTI_BULK;
try
{
r.multi_bulk_size = convertTo<int>(reply.substr(0, nl));
}
catch (const ConvertException &) { }
if (auto size = Anope::TryConvert<int>(reply.substr(0, nl)))
r.multi_bulk_size = size.value();
used = 1 + nl + 2;
}
else
+24 -17
View File
@@ -38,28 +38,35 @@ struct Rewrite final
else
{
int num = -1, end = -1;
try
Anope::string num_str = token.substr(1);
size_t hy = num_str.find('-');
if (hy == Anope::string::npos)
{
Anope::string num_str = token.substr(1);
size_t hy = num_str.find('-');
if (hy == Anope::string::npos)
{
num = convertTo<int>(num_str);
end = num + 1;
}
auto n = Anope::TryConvert<int>(num_str);
if (!n.has_value())
continue;
num = n.value();
end = num + 1;
}
else
{
auto n = Anope::TryConvert<int>(num_str.substr(0, hy));
if (!n.has_value())
continue;
num = n.value();
if (hy == num_str.length() - 1)
end = params.size();
else
{
num = convertTo<int>(num_str.substr(0, hy));
if (hy == num_str.length() - 1)
end = params.size();
else
end = convertTo<int>(num_str.substr(hy + 1)) + 1;
n = Anope::TryConvert<int>(num_str.substr(hy + 1));
if (!n.has_value())
continue;
end = n.value() + 1;
}
}
catch (const ConvertException &)
{
continue;
}
for (int i = num; i < end && static_cast<unsigned>(i) < params.size(); ++i)
message += " " + params[i];
+4 -8
View File
@@ -73,14 +73,10 @@ bool WebCPanel::MemoServ::Memos::OnRequest(HTTPProvider *server, const Anope::st
std::vector<Anope::string> params;
int number = -1;
try
{
number = convertTo<int>(message.get_data["number"]);
}
catch (const ConvertException &ex)
{
if (auto num = Anope::TryConvert<int>(message.get_data["number"]))
number = num.value();
else
replacements["MESSAGES"] = "ERROR - invalid parameter for NUMBER";
}
if (number > 0)
{
@@ -98,7 +94,7 @@ bool WebCPanel::MemoServ::Memos::OnRequest(HTTPProvider *server, const Anope::st
for (unsigned i = 0; i < mi->memos->size(); ++i)
{
m = mi->GetMemo(i);
replacements["NUMBER"] = stringify(i+1);
replacements["NUMBER"] = Anope::ToString(i+1);
replacements["SENDER"] = m->sender;
replacements["TIME"] = Anope::strftime(m->time);
replacements["TEXT"] = m->text;
+2 -2
View File
@@ -30,7 +30,7 @@ bool WebCPanel::NickServ::Alist::OnRequest(HTTPProvider *server, const Anope::st
{
++chan_count;
replacements["NUMBERS"] = stringify(chan_count);
replacements["NUMBERS"] = Anope::ToString(chan_count);
replacements["CHANNELS"] = (ci->HasExt("CS_NO_EXPIRE") ? "!" : "") + ci->name;
replacements["ACCESSES"] = "Founder";
continue;
@@ -42,7 +42,7 @@ bool WebCPanel::NickServ::Alist::OnRequest(HTTPProvider *server, const Anope::st
++chan_count;
replacements["NUMBERS"] = stringify(chan_count);
replacements["NUMBERS"] = Anope::ToString(chan_count);
replacements["CHANNELS"] = (ci->HasExt("CS_NO_EXPIRE") ? "!" : "") + ci->name;
const ChanAccess *highest = access.Highest();
+1 -1
View File
@@ -48,7 +48,7 @@ bool WebCPanel::OperServ::Akill::OnRequest(HTTPProvider *server, const Anope::st
for (unsigned i = 0, end = akills->GetCount(); i < end; ++i)
{
const XLine *x = akills->GetEntry(i);
replacements["NUMBER"] = stringify(i + 1);
replacements["NUMBER"] = Anope::ToString(i + 1);
replacements["HOST"] = x->mask;
replacements["SETTER"] = x->by;
replacements["TIME"] = Anope::strftime(x->created, NULL, true);
+14 -14
View File
@@ -141,7 +141,7 @@ private:
static void DoStats(XMLRPCServiceInterface *iface, HTTPClient *client, XMLRPCRequest &request)
{
request.reply("uptime", stringify(Anope::CurTime - Anope::StartTime));
request.reply("uptime", Anope::ToString(Anope::CurTime - Anope::StartTime));
request.reply("uplinkname", Me->GetLinks().front()->GetName());
{
Anope::string buf;
@@ -151,9 +151,9 @@ private:
buf.erase(buf.begin());
request.reply("uplinkcapab", buf);
}
request.reply("usercount", stringify(UserListByNick.size()));
request.reply("maxusercount", stringify(MaxUserCount));
request.reply("channelcount", stringify(ChannelList.size()));
request.reply("usercount", Anope::ToString(UserListByNick.size()));
request.reply("maxusercount", Anope::ToString(MaxUserCount));
request.reply("channelcount", Anope::ToString(ChannelList.size()));
}
static void DoChannel(XMLRPCServiceInterface *iface, HTTPClient *client, XMLRPCRequest &request)
@@ -167,20 +167,20 @@ private:
if (c)
{
request.reply("bancount", stringify(c->HasMode("BAN")));
request.reply("bancount", Anope::ToString(c->HasMode("BAN")));
int count = 0;
for (auto &ban : c->GetModeList("BAN"))
request.reply("ban" + stringify(++count), iface->Sanitize(ban));
request.reply("ban" + Anope::ToString(++count), iface->Sanitize(ban));
request.reply("exceptcount", stringify(c->HasMode("EXCEPT")));
request.reply("exceptcount", Anope::ToString(c->HasMode("EXCEPT")));
count = 0;
for (auto &except : c->GetModeList("EXCEPT"))
request.reply("except" + stringify(++count), iface->Sanitize(except));
request.reply("except" + Anope::ToString(++count), iface->Sanitize(except));
request.reply("invitecount", stringify(c->HasMode("INVITEOVERRIDE")));
request.reply("invitecount", Anope::ToString(c->HasMode("INVITEOVERRIDE")));
count = 0;
for (auto &invite : c->GetModeList("INVITEOVERRIDE"))
request.reply("invite" + stringify(++count), iface->Sanitize(invite));
request.reply("invite" + Anope::ToString(++count), iface->Sanitize(invite));
Anope::string users;
for (Channel::ChanUserList::const_iterator it = c->users.begin(); it != c->users.end(); ++it)
@@ -200,8 +200,8 @@ private:
if (!c->topic_setter.empty())
request.reply("topicsetter", iface->Sanitize(c->topic_setter));
request.reply("topictime", stringify(c->topic_time));
request.reply("topicts", stringify(c->topic_ts));
request.reply("topictime", Anope::ToString(c->topic_time));
request.reply("topicts", Anope::ToString(c->topic_ts));
}
}
@@ -224,8 +224,8 @@ private:
if (!u->chost.empty())
request.reply("chost", iface->Sanitize(u->chost));
request.reply("ip", u->ip.addr());
request.reply("timestamp", stringify(u->timestamp));
request.reply("signon", stringify(u->signon));
request.reply("timestamp", Anope::ToString(u->timestamp));
request.reply("signon", Anope::ToString(u->signon));
if (u->Account())
{
request.reply("account", iface->Sanitize(u->Account()->display));
+8 -8
View File
@@ -824,12 +824,12 @@ void Conf::LoadConf(File &file)
if (block_stack.empty() || itemname.empty())
{
file.Close();
throw ConfigException("Unexpected quoted string: " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Unexpected quoted string: " + file.GetName() + ":" + Anope::ToString(linenumber));
}
if (in_word || !wordbuffer.empty())
{
file.Close();
throw ConfigException("Unexpected quoted string (prior unhandled words): " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Unexpected quoted string (prior unhandled words): " + file.GetName() + ":" + Anope::ToString(linenumber));
}
in_quote = in_word = true;
}
@@ -838,13 +838,13 @@ void Conf::LoadConf(File &file)
if (block_stack.empty())
{
file.Close();
throw ConfigException("Config item outside of section (or stray '='): " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Config item outside of section (or stray '='): " + file.GetName() + ":" + Anope::ToString(linenumber));
}
if (!itemname.empty() || wordbuffer.empty())
{
file.Close();
throw ConfigException("Stray '=' sign or item without value: " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Stray '=' sign or item without value: " + file.GetName() + ":" + Anope::ToString(linenumber));
}
in_word = false;
@@ -891,7 +891,7 @@ void Conf::LoadConf(File &file)
if (!in_word && !wordbuffer.empty())
{
file.Close();
throw ConfigException("Unexpected word: " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Unexpected word: " + file.GetName() + ":" + Anope::ToString(linenumber));
}
wordbuffer += ch;
in_word = true;
@@ -918,7 +918,7 @@ void Conf::LoadConf(File &file)
if (block_stack.empty())
{
file.Close();
throw ConfigException("Stray ';' outside of block: " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Stray ';' outside of block: " + file.GetName() + ":" + Anope::ToString(linenumber));
}
Block *b = block_stack.top();
@@ -949,7 +949,7 @@ void Conf::LoadConf(File &file)
if (block_stack.empty())
{
file.Close();
throw ConfigException("Stray '}': " + file.GetName() + ":" + stringify(linenumber));
throw ConfigException("Stray '}': " + file.GetName() + ":" + Anope::ToString(linenumber));
}
block_stack.pop();
@@ -969,7 +969,7 @@ void Conf::LoadConf(File &file)
if (!block_stack.empty())
{
if (block_stack.top())
throw ConfigException("Unterminated block at end of file: " + file.GetName() + ". Block was opened on line " + stringify(block_stack.top()->linenum));
throw ConfigException("Unterminated block at end of file: " + file.GetName() + ". Block was opened on line " + Anope::ToString(block_stack.top()->linenum));
else
throw ConfigException("Unterminated commented block at end of file: " + file.GetName());
}
+3 -3
View File
@@ -148,10 +148,10 @@ void Anope::HandleSignal()
case SIGINT:
#ifndef _WIN32
Log() << "Received " << strsignal(Signal) << " signal (" << Signal << "), exiting.";
Anope::QuitReason = Anope::string("Services terminating via signal ") + strsignal(Signal) + " (" + stringify(Signal) + ")";
Anope::QuitReason = Anope::string("Services terminating via signal ") + strsignal(Signal) + " (" + Anope::ToString(Signal) + ")";
#else
Log() << "Received signal " << Signal << ", exiting.";
Anope::QuitReason = Anope::string("Services terminating via signal ") + stringify(Signal);
Anope::QuitReason = Anope::string("Services terminating via signal ") + Anope::ToString(Signal);
#endif
Anope::Quitting = true;
Anope::SaveDatabases();
@@ -355,7 +355,7 @@ bool Anope::Init(int ac, char **av)
{
if (!arg.empty())
{
int level = arg.is_number_only() ? convertTo<int>(arg) : -1;
auto level = Anope::Convert<int>(arg, -1);
if (level > 0)
Anope::Debug = level;
else
+36 -44
View File
@@ -45,13 +45,12 @@ NumberList::NumberList(const Anope::string &list, bool descending) : desc(descen
if (t == Anope::string::npos)
{
try
if (auto num = Anope::TryConvert<unsigned>(token, &error))
{
unsigned num = convertTo<unsigned>(token, error, false);
if (error.empty())
numbers.insert(num);
numbers.insert(num.value());
}
catch (const ConvertException &)
else
{
error = "1";
}
@@ -68,15 +67,17 @@ NumberList::NumberList(const Anope::string &list, bool descending) : desc(descen
else
{
Anope::string error2;
try
auto n1 = Anope::TryConvert<unsigned>(token.substr(0, t), &error);
auto n2 = Anope::TryConvert<unsigned>(token.substr(t + 1), &error);
if (n1.has_value() && n2.has_value())
{
unsigned num1 = convertTo<unsigned>(token.substr(0, t), error, false);
unsigned num2 = convertTo<unsigned>(token.substr(t + 1), error2, false);
auto num1 = n1.value();
auto num2 = n2.value();
if (error.empty() && error2.empty())
for (unsigned i = num1; i <= num2; ++i)
numbers.insert(i);
}
catch (const ConvertException &)
else
{
error = "1";
}
@@ -271,37 +272,28 @@ time_t Anope::DoTime(const Anope::string &s)
if (s.empty())
return 0;
int amount = 0;
Anope::string end;
try
auto amount = Anope::Convert<int>(s, -1, &end);
if (!end.empty())
{
amount = convertTo<int>(s, end, false);
if (!end.empty())
switch (end[0])
{
switch (end[0])
{
case 's':
return amount;
case 'm':
return amount * 60;
case 'h':
return amount * 3600;
case 'd':
return amount * 86400;
case 'w':
return amount * 86400 * 7;
case 'y':
return amount * 86400 * 365;
default:
break;
}
case 's':
return amount;
case 'm':
return amount * 60;
case 'h':
return amount * 3600;
case 'd':
return amount * 86400;
case 'w':
return amount * 86400 * 7;
case 'y':
return amount * 86400 * 365;
default:
break;
}
}
catch (const ConvertException &)
{
amount = -1;
}
return amount;
}
@@ -316,32 +308,32 @@ Anope::string Anope::Duration(time_t t, const NickCore *nc)
time_t seconds = (t) % 60;
if (!years && !days && !hours && !minutes)
return stringify(seconds) + " " + (seconds != 1 ? Language::Translate(nc, _("seconds")) : Language::Translate(nc, _("second")));
return Anope::ToString(seconds) + " " + (seconds != 1 ? Language::Translate(nc, _("seconds")) : Language::Translate(nc, _("second")));
else
{
bool need_comma = false;
Anope::string buffer;
if (years)
{
buffer = stringify(years) + " " + (years != 1 ? Language::Translate(nc, _("years")) : Language::Translate(nc, _("year")));
buffer = Anope::ToString(years) + " " + (years != 1 ? Language::Translate(nc, _("years")) : Language::Translate(nc, _("year")));
need_comma = true;
}
if (days)
{
buffer += need_comma ? ", " : "";
buffer += stringify(days) + " " + (days != 1 ? Language::Translate(nc, _("days")) : Language::Translate(nc, _("day")));
buffer += Anope::ToString(days) + " " + (days != 1 ? Language::Translate(nc, _("days")) : Language::Translate(nc, _("day")));
need_comma = true;
}
if (hours)
{
buffer += need_comma ? ", " : "";
buffer += stringify(hours) + " " + (hours != 1 ? Language::Translate(nc, _("hours")) : Language::Translate(nc, _("hour")));
buffer += Anope::ToString(hours) + " " + (hours != 1 ? Language::Translate(nc, _("hours")) : Language::Translate(nc, _("hour")));
need_comma = true;
}
if (minutes)
{
buffer += need_comma ? ", " : "";
buffer += stringify(minutes) + " " + (minutes != 1 ? Language::Translate(nc, _("minutes")) : Language::Translate(nc, _("minute")));
buffer += Anope::ToString(minutes) + " " + (minutes != 1 ? Language::Translate(nc, _("minutes")) : Language::Translate(nc, _("minute")));
}
return buffer;
}
@@ -596,23 +588,23 @@ Anope::string Anope::LastError()
Anope::string Anope::Version()
{
#ifdef VERSION_GIT
return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH) + VERSION_EXTRA + " (" + VERSION_GIT + ")";
return Anope::ToString(VERSION_MAJOR) + "." + Anope::ToString(VERSION_MINOR) + "." + Anope::ToString(VERSION_PATCH) + VERSION_EXTRA + " (" + VERSION_GIT + ")";
#else
return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH) + VERSION_EXTRA;
return Anope::ToString(VERSION_MAJOR) + "." + Anope::ToString(VERSION_MINOR) + "." + Anope::ToString(VERSION_PATCH) + VERSION_EXTRA;
#endif
}
Anope::string Anope::VersionShort()
{
return stringify(VERSION_MAJOR) + "." + stringify(VERSION_MINOR) + "." + stringify(VERSION_PATCH);
return Anope::ToString(VERSION_MAJOR) + "." + Anope::ToString(VERSION_MINOR) + "." + Anope::ToString(VERSION_PATCH);
}
Anope::string Anope::VersionBuildString()
{
#ifdef REPRODUCIBLE_BUILD
Anope::string s = "build #" + stringify(BUILD);
Anope::string s = "build #" + Anope::ToString(BUILD);
#else
Anope::string s = "build #" + stringify(BUILD) + ", compiled " + Anope::compiled;
Anope::string s = "build #" + Anope::ToString(BUILD) + ", compiled " + Anope::compiled;
#endif
Anope::string flags;
+10 -17
View File
@@ -398,7 +398,7 @@ bool ModeManager::AddUserMode(UserMode *um)
if (um->name.empty())
{
um->name = stringify(++GenericUserModes);
um->name = Anope::ToString(++GenericUserModes);
Log() << "ModeManager: Added generic support for user mode " << um->mchar;
}
@@ -425,7 +425,7 @@ bool ModeManager::AddChannelMode(ChannelMode *cm)
if (cm->name.empty())
{
cm->name = stringify(++GenericChannelModes);
cm->name = Anope::ToString(++GenericChannelModes);
Log() << "ModeManager: Added generic support for channel mode " << cm->mchar;
}
@@ -783,22 +783,15 @@ Entry::Entry(const Anope::string &m, const Anope::string &fh) : name(m), mask(fh
&cidr_range = this->host.substr(sl + 1);
sockaddrs addr(cidr_ip);
try
auto range = Anope::TryConvert<unsigned short>(cidr_range);
if (addr.valid() && range.has_value())
{
if (addr.valid() && cidr_range.is_pos_number_only())
{
this->cidr_len = convertTo<unsigned short>(cidr_range);
this->cidr_len = range.value();
this->host = cidr_ip;
this->family = addr.family();
/* If we got here, cidr_len is a valid number. */
this->host = cidr_ip;
this->family = addr.family();
Log(LOG_DEBUG) << "Ban " << mask << " has cidr " << this->cidr_len;
}
Log(LOG_DEBUG) << "Ban " << mask << " has cidr " << this->cidr_len;
}
catch (const ConvertException &) { }
}
}
@@ -822,11 +815,11 @@ Anope::string Entry::GetNUHMask() const
{
case AF_INET:
if (cidr_len <= 32)
c = "/" + stringify(cidr_len);
c = "/" + Anope::ToString(cidr_len);
break;
case AF_INET6:
if (cidr_len <= 128)
c = "/" + stringify(cidr_len);
c = "/" + Anope::ToString(cidr_len);
break;
}
+1 -1
View File
@@ -348,7 +348,7 @@ void ModuleManager::RequireVersion(int major, int minor, int patch)
}
}
throw ModuleException("This module requires version " + stringify(major) + "." + stringify(minor) + "." + stringify(patch) + " - this is " + Anope::VersionShort());
throw ModuleException("This module requires version " + Anope::ToString(major) + "." + Anope::ToString(minor) + "." + Anope::ToString(patch) + " - this is " + Anope::VersionShort());
}
ModuleReturn ModuleManager::DeleteModule(Module *m)
+1 -1
View File
@@ -213,7 +213,7 @@ uint64_t NickCore::GetId()
return 0;
}
Anope::string secretid = this->display + "\0" + stringify(na->time_registered);
Anope::string secretid = this->display + "\0" + Anope::ToString(na->time_registered);
// Generate the account id. This should almost always only have one
// iteration but in the rare case that we generate a duplicate id we try
+1 -1
View File
@@ -157,7 +157,7 @@ void IRCDProto::SendCTCPInternal(const MessageSource &source, const Anope::strin
void IRCDProto::SendNumericInternal(int numeric, const Anope::string &dest, const std::vector<Anope::string> &params)
{
Anope::string n = stringify(numeric);
Anope::string n = Anope::ToString(numeric);
if (numeric < 10)
n = "0" + n;
if (numeric < 100)
+5 -6
View File
@@ -195,7 +195,7 @@ void ChannelInfo::Serialize(Serialize::Data &data) const
{
Anope::string levels_buffer;
for (const auto &[name, level] : this->levels)
levels_buffer += name + " " + stringify(level) + " ";
levels_buffer += name + " " + Anope::ToString(level) + " ";
data["levels"] << levels_buffer;
}
if (this->bi)
@@ -238,11 +238,10 @@ Serializable *ChannelInfo::Unserialize(Serializable *obj, Serialize::Data &data)
std::vector<Anope::string> v;
spacesepstream(slevels).GetTokens(v);
for (unsigned i = 0; i + 1 < v.size(); i += 2)
try
{
ci->levels[v[i]] = convertTo<int16_t>(v[i + 1]);
}
catch (const ConvertException &) { }
{
if (auto level = Anope::TryConvert<int16_t>(v[i + 1]))
ci->levels[v[i]] = level.value();
}
}
BotInfo *bi = BotInfo::Find(sbi, true);
if (*ci->bi != bi)
+1 -1
View File
@@ -67,7 +67,7 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
return;
if (epoll_ctl(EngineHandle, mod, ev.data.fd, &ev) == -1)
throw SocketException("Unable to epoll_ctl() fd " + stringify(ev.data.fd) + " to epoll: " + Anope::LastError());
throw SocketException("Unable to epoll_ctl() fd " + Anope::ToString(ev.data.fd) + " to epoll: " + Anope::LastError());
}
void SocketEngine::Process()
+2 -2
View File
@@ -71,7 +71,7 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
{
std::map<int, unsigned>::iterator pos = socket_positions.find(s->GetFD());
if (pos == socket_positions.end())
throw SocketException("Unable to remove fd " + stringify(s->GetFD()) + " from poll, it does not exist?");
throw SocketException("Unable to remove fd " + Anope::ToString(s->GetFD()) + " from poll, it does not exist?");
if (pos->second != events.size() - 1)
{
@@ -90,7 +90,7 @@ void SocketEngine::Change(Socket *s, bool set, SocketFlag flag)
{
std::map<int, unsigned>::iterator pos = socket_positions.find(s->GetFD());
if (pos == socket_positions.end())
throw SocketException("Unable to modify fd " + stringify(s->GetFD()) + " in poll, it does not exist?");
throw SocketException("Unable to modify fd " + Anope::ToString(s->GetFD()) + " in poll, it does not exist?");
pollfd &ev = events[pos->second];
ev.events = (s->flags[SF_READABLE] ? POLLIN : 0) | (s->flags[SF_WRITABLE] ? POLLOUT : 0);
+1 -7
View File
@@ -282,13 +282,7 @@ cidr::cidr(const Anope::string &ip)
Anope::string cidr_range = ip.substr(sl + 1);
this->cidr_ip = real_ip;
this->cidr_len = ipv6 ? 128 : 32;
try
{
if (cidr_range.is_pos_number_only())
this->cidr_len = convertTo<unsigned int>(cidr_range);
}
catch (const ConvertException &) { }
this->cidr_len = Anope::Convert<unsigned int>(cidr_range, ipv6 ? 128 : 32);
this->addr.pton(ipv6 ? AF_INET6 : AF_INET, real_ip);
}
}