Author: soliton
Date: Wed Apr 22 17:44:30 2009
New Revision: 35123
URL: http://svn.gna.org/viewcvs/wesnoth?rev=35123&view=rev
Log:
rewrote ban time parsing
* all time modifiers are now case insensitive except months (M) and minutes (m)
and you can also write (part of) them out
* invalid time modifiers cause an error
* permanent has to be explicitely stated as 'permanent' or '0'
Modified:
trunk/src/server/ban.cpp
trunk/src/server/ban.hpp
trunk/src/server/server.cpp
Modified: trunk/src/server/ban.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/ban.cpp?rev=35123&r1=35122&r2=35123&view=diff
==============================================================================
--- trunk/src/server/ban.cpp (original)
+++ trunk/src/server/ban.cpp Wed Apr 22 17:44:30 2009
@@ -342,19 +342,17 @@
writer.write(cfg);
}
- time_t ban_manager::parse_time(std::string time_in) const
- {
- time_t ret;
- ret = time(NULL);
- if (time_in.substr(0,4) == "TIME")
- {
+ bool ban_manager::parse_time(const std::string& duration, time_t* time)
const
+ {
+ if (!time) return false;
+
+ if (duration.substr(0,4) == "TIME") {
struct tm* loc;
- loc = localtime(&ret);
-
- std::string::iterator i = time_in.begin() + 4;
+ loc = localtime(time);
+
size_t number = 0;
- for (; i != time_in.end(); ++i)
- {
+ for (std::string::const_iterator i = duration.begin() +
4;
+ i != duration.end(); ++i) {
if (is_digit(*i))
{
number = number * 10 + to_digit(*i);
@@ -388,64 +386,94 @@
number = 0;
}
}
- return mktime(loc);
- }
- default_ban_times::const_iterator time_itor =
ban_times_.find(time_in);
- if (time_itor != ban_times_.end())
- ret += time_itor->second;
- else
- {
- const size_t default_multipler = 60; // default to
minutes
- size_t multipler = default_multipler;
- std::string::iterator i = time_in.begin();
- size_t number = 0;
- for (; i != time_in.end(); ++i)
- {
+ *time = mktime(loc);
+ return true;
+ }
+ default_ban_times::const_iterator time_itor =
ban_times_.find(duration);
+ if (utils::lowercase(duration) == "permanent" || duration ==
"0") {
+ *time = 0;
+ } else if (ban_times_.find(duration) != ban_times_.end()) {
+ *time += time_itor->second;
+ } else {
+ std::string::const_iterator i = duration.begin();
+ int number = -1;
+ for (std::string::const_iterator d_end =
duration.end(); i != d_end; ++i) {
if (is_digit(*i))
{
+ if (number == -1) number = 0;
number = number * 10 + to_digit(*i);
} else {
+ if (number == -1) number = 1;
switch(*i)
{
case 'Y':
- multipler =
365*24*60*60; // a year;
+ case 'y':
+ if (++i != d_end &&
tolower(*i) == 'e'
+ && ++i != d_end &&
tolower(*i) == 'a'
+ && ++i != d_end &&
tolower(*i) == 'r'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number *
365*24*60*60; // a year;
break;
case 'M':
- multipler =
30*24*60*60; // 30 days
+ if (++i != d_end &&
tolower(*i) == 'o'
+ && ++i != d_end &&
tolower(*i) == 'n'
+ && ++i != d_end &&
tolower(*i) == 't'
+ && ++i != d_end &&
tolower(*i) == 'h'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number *
30*24*60*60; // 30 days
break;
case 'D':
- multipler = 24*60*60;
- break;
+ case 'd':
+ if (++i != d_end &&
tolower(*i) == 'a'
+ && ++i != d_end &&
tolower(*i) == 'y'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number *
24*60*60;
+ break;
+ case 'H':
case 'h':
- multipler = 60*60;
+ if (++i != d_end &&
tolower(*i) == 'o'
+ && ++i != d_end &&
tolower(*i) == 'u'
+ && ++i != d_end &&
tolower(*i) == 'r'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number * 60*60;
break;
case 'm':
- multipler = 60;
- break;
+ if (++i != d_end &&
tolower(*i) == 'i'
+ && ++i != d_end &&
tolower(*i) == 'n'
+ && ++i != d_end &&
tolower(*i) == 'u'
+ && ++i != d_end &&
tolower(*i) == 't'
+ && ++i != d_end &&
tolower(*i) == 'e'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number * 60;
+ break;
+ case 'S':
case 's':
- multipler = 1;
+ if (++i != d_end &&
tolower(*i) == 'e'
+ && ++i != d_end &&
tolower(*i) == 'c'
+ && ++i != d_end &&
tolower(*i) == 'o'
+ && ++i != d_end &&
tolower(*i) == 'n'
+ && ++i != d_end &&
tolower(*i) == 'd'
+ && ++i != d_end &&
tolower(*i) == 's') {
+ } else --i;
+ *time += number;
break;
default:
- DBG_SERVER << "Invalid
time modifier given: '" << *i << "'. Assuming this is the begin of the
reason.\n";
- ret = number =
multipler = 0;
+ return false;
break;
}
- if (multipler == 0)
- break;
- if (number == 0)
- number = 1;
- ret += number * multipler;
- multipler = default_multipler;
- number = 0;
+ number = -1;
}
}
- --i;
- if (is_digit(*i))
- {
- ret += number * multipler;
- }
- }
- return ret;
+ if (is_digit(*--i)) {
+ *time += number * 60; // default to
minutes
+ }
+ }
+ return true;
}
std::string ban_manager::ban(const std::string& ip,
@@ -613,8 +641,10 @@
void ban_manager::init_ban_help()
{
- ban_help_ = "ban <ip|nickmask> [<time>] <reason>\n"
- "The time format is: %d[%s[%d[%s[...]]]] where
%s is a time modifier: s (seconds), m (minutes), h (hours), D (days), M
(months) or Y (years) and %d is a number.\n"
+ ban_help_ = "ban <mask> <time> <reason>\n"
+ "The time format is: %d[%s[%d[%s[...]]]] where
%s is a time"
+ " modifier: s or S (seconds), m (minutes), h or
H (hours), d"
+ " or D (days), M (months) or y or Y (years) and
%d is a number.\n"
"If no time is given then the ban is
permanent.\n";
default_ban_times::iterator itor = ban_times_.begin();
if (itor != ban_times_.end())
@@ -628,7 +658,7 @@
}
if (!ban_times_.empty())
{
- ban_help_ += " for standard ban times.\n";
+ ban_help_ += " for standard ban times. (not
combinable)\n";
}
ban_help_ += "ban 127.0.0.1 2h20m flooded lobby\n"
"kban suokko 5D flooded again\n"
@@ -639,8 +669,9 @@
{
ban_times_.clear();
foreach (const config &bt, cfg.child_range("ban_time")) {
-
ban_times_.insert(default_ban_times::value_type(bt["name"],
- parse_time(bt["time"]) - time(NULL)));
+ time_t duration = 0;
+ parse_time(bt["time"], &duration);
+
ban_times_.insert(default_ban_times::value_type(bt["name"], duration));
}
init_ban_help();
if (filename_ != cfg["ban_save_file"])
Modified: trunk/src/server/ban.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/ban.hpp?rev=35123&r1=35122&r2=35123&view=diff
==============================================================================
--- trunk/src/server/ban.hpp (original)
+++ trunk/src/server/ban.hpp Wed Apr 22 17:44:30 2009
@@ -151,7 +151,13 @@
void read();
void write();
- time_t parse_time(std::string time_in) const;
+ /**
+ * Parses the given duration and adds it to *time except if the
+ * duration is '0' or 'permanent' in which case *time will be
set to '0'.
+ * @returns false if an invalid time modifier is encountered.
+ * *time is undefined in that case.
+ */
+ bool parse_time(const std::string& duration, time_t* time)
const;
std::string ban(const std::string&, const time_t&, const
std::string&, const std::string&, const std::string&, const std::string& = "");
void unban(std::ostringstream& os, const std::string& ip);
Modified: trunk/src/server/server.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/server/server.cpp?rev=35123&r1=35122&r2=35123&view=diff
==============================================================================
--- trunk/src/server/server.cpp (original)
+++ trunk/src/server/server.cpp Wed Apr 22 17:44:30 2009
@@ -1295,7 +1295,7 @@
std::string parameters = (i == query.end() ? "" :
std::string(i+1,query.end()));
utils::strip(parameters);
const std::string& help_msg = "Available commands are: adminmsg <msg>,"
- " ban <mask> [<time>] <reason>, bans [deleted], clones,"
+ " ban <mask> <time> <reason>, bans [deleted], clones,"
" dul|deny_unregistered_login [yes|no], kick <mask>
[<reason>],"
" k[ick]ban <mask> [<time>] <reason>, help, games,
metrics,"
" netstats [all], [lobby]msg <message>, motd
[<message>],"
@@ -1472,10 +1472,10 @@
first_space = second_space;
second_space = std::find(first_space + 1,
parameters.end(), ' ');
}
- const std::string time(first_space + 1, second_space);
- time_t parsed_time = ban_manager_.parse_time(time);
- if (parsed_time == 0) {
- second_space = first_space;
+ const std::string duration(first_space + 1, second_space);
+ time_t parsed_time = time(NULL);
+ if (ban_manager_.parse_time(duration, &parsed_time) == false) {
+ return ban_manager_.get_ban_help();
}
if (second_space == parameters.end()) {
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits