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

Reply via email to