From 98fc7ee46617bebb0f18fb365f194613fed345cd Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 24 Aug 2011 02:44:56 +0200 Subject: [PATCH] added strToTime function and started writing cmd_trim --- bot_NeonServ.c | 3 +- cmd_neonserv_trim.c | 46 +++++++++++++++++ tools.c | 119 ++++++++++++++++++++++++++++++++++++-------- tools.h | 3 +- 4 files changed, 147 insertions(+), 24 deletions(-) create mode 100644 cmd_neonserv_trim.c diff --git a/bot_NeonServ.c b/bot_NeonServ.c index a9d4535..1dda375 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -90,7 +90,7 @@ INCLUDE ALL CMD's HERE #include "cmd_neonserv_deluser.c" #include "cmd_neonserv_delme.c" #include "cmd_neonserv_mdeluser.c" -//#include "cmd_neonserv_trim.c" +#include "cmd_neonserv_trim.c" /* TODO: trim bans */ //#include "cmd_neonserv_giveownership.c" #include "cmd_neonserv_users.c" #include "cmd_neonserv_up.c" @@ -239,6 +239,7 @@ void init_NeonServ() { register_command(BOTID, "upall", neonserv_cmd_upall, 0, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); register_command(BOTID, "downall", neonserv_cmd_downall, 0, 0); register_command(BOTID, "mdeluser", neonserv_cmd_mdeluser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "trim", neonserv_cmd_trim, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_trim.c b/cmd_neonserv_trim.c new file mode 100644 index 0000000..e938ed5 --- /dev/null +++ b/cmd_neonserv_trim.c @@ -0,0 +1,46 @@ + +/* +* argv[0] target (format: minaccess-maxaccess/users/bans) +* argv[1] duration +* argv[2] (optional) "vacation" +*/ + +static CMD_BIND(neonserv_cmd_trim) { + check_mysql(); + if(!checkChannelAccess(user, chan, "channel_candel", 1, 0)) { + reply(getTextBot(), user, "NS_ACCESS_DENIED"); + return; + } + int min_access, max_access; + if(!strcmp(argv[0], "users")) { + min_access = 1; + max_access = getChannelAccess(user, chan, 0) - 1; + } else if(!strcmp(argv[0], "bans")) { + //TODO: TRIM BANS + return; + } else { + char *seperator = strstr(argv[0], "-"); + if(seperator) { + seperator = '\0'; + seperator++; + min_access = atoi(argv[0]); + max_access = atoi(seperator); + if(max_access > min_access) { + reply(getTextBot(), user, "NS_INVALID_ACCESS_RANGE", min_access, max_access); + return; + } + } else { + min_access = atoi(argv[0]); + max_access = min_access; + } + if(max_access >= getChannelAccess(user, chan, 1)) { + reply(getTextBot(), user, "NS_NO_ACCESS"); + return; + } + } + //parse duration... + int duration = strToTime(user, argv[1]); + char timeBuf[MAXLEN]; + reply(getTextBot(), user, "yea; time: %d (%s)", duration, timeToStr(user, duration, 3, timeBuf)); +} + diff --git a/tools.c b/tools.c index 70cfc1e..55b6920 100644 --- a/tools.c +++ b/tools.c @@ -5,16 +5,20 @@ static const struct default_language_entry msgtab[] = { {"TIME_MASK_2_ITEMS", "%s and %s"}, {"TIME_MASK_3_ITEMS", "%s, %s and %s"}, - {"TIME_YEAR", "%d year"}, - {"TIME_YEARS", "%d years"}, - {"TIME_DAY", "%d day"}, - {"TIME_DAYS", "%d days"}, - {"TIME_HOUR", "%d hour"}, - {"TIME_HOURS", "%d hours"}, - {"TIME_MINUTE", "%d minute"}, - {"TIME_MINUTES", "%d minutes"}, - {"TIME_SECOND", "%d second"}, - {"TIME_SECONDS", "%d seconds"}, + {"TIME_YEAR", "year"}, + {"TIME_YEARS", "years"}, + {"TIME_MONTH", "month"}, + {"TIME_MONTHS", "months"}, + {"TIME_WEEK", "week"}, + {"TIME_WEEKS", "weeks"}, + {"TIME_DAY", "day"}, + {"TIME_DAYS", "days"}, + {"TIME_HOUR", "hour"}, + {"TIME_HOURS", "hours"}, + {"TIME_MINUTE", "minute"}, + {"TIME_MINUTES", "minutes"}, + {"TIME_SECOND", "second"}, + {"TIME_SECONDS", "seconds"}, {NULL, NULL} }; @@ -182,40 +186,40 @@ void table_free(struct Table *table) { free(table); } -int timeToStr(struct UserNode *user, int seconds, int items, char *buf) { - char *item[items]; +char* timeToStr(struct UserNode *user, int seconds, int items, char *buf) { + char item[items][MAXLEN]; int tmp, citem = 0; if(citem != items && seconds >= 31536000) { //60*60*24*365 = 31536000 tmp = seconds / 31536000; - item[citem++] = build_language_string(user, NULL, (tmp == 1 ? "TIME_YEAR" : "TIME_YEARS"), tmp); + sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_YEAR" : "TIME_YEARS")); seconds -= tmp * 31536000; } if(citem != items && seconds >= 86400) { //60*60*24 = 86400 tmp = seconds / 86400; - item[citem++] = build_language_string(user, NULL, (tmp == 1 ? "TIME_DAY" : "TIME_DAYS"), tmp); + sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_DAY" : "TIME_DAYS")); seconds -= tmp * 86400; } if(citem != items && seconds >= 3600) { //60*60 = 3600 tmp = seconds / 3600; - item[citem++] = build_language_string(user, NULL, (tmp == 1 ? "TIME_HOUR" : "TIME_HOURS"), tmp); + sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_HOUR" : "TIME_HOURS")); seconds -= tmp * 3600; } if(citem != items && seconds >= 60) { tmp = seconds / 60; - item[citem++] = build_language_string(user, NULL, (tmp == 1 ? "TIME_MINUTE" : "TIME_MINUTES"), tmp); + sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_MINUTE" : "TIME_MINUTES")); seconds -= tmp * 60; } if(citem != items && seconds >= 1) { - item[citem++] = build_language_string(user, NULL, (seconds == 1 ? "TIME_SECOND" : "TIME_SECONDS"), seconds); + sprintf(item[citem++], "%d %s", seconds, get_language_string(user, seconds == 1 ? "TIME_SECOND" : "TIME_SECONDS")); } - if(items == 2) { + if(citem == 2) { build_language_string(user, buf, "TIME_MASK_2_ITEMS", item[0], item[1]); - } else if(items == 3) { + } else if(citem == 3) { build_language_string(user, buf, "TIME_MASK_3_ITEMS", item[0], item[1], item[2]); } else { int i, ii, p = 0; - for(i = 0; i < items; i++) { + for(i = 0; i < citem; i++) { for(ii = 0; ii < strlen(item[i]); ii++) { buf[p++] = item[i][ii]; } @@ -223,10 +227,81 @@ int timeToStr(struct UserNode *user, int seconds, int items, char *buf) { } buf[p-1] = '\0'; } - return 1; + return buf; } - +int strToTime(struct UserNode *user, char *str) { + /* + * y = year = 365 days + * M = month = 30 days + * w = week = 7 days + * d = day + * h = hour + * m = minute + * (s) = second + */ + int total_time = 0, cvalue; + char *p, tmpchar; + int unit_multiplikator; + while(*str) { + p = str; + while(*p && isdigit(*p)) //get the value + p++; + tmpchar = *p; + *p = '\0'; + cvalue = isdigit(*str) ? atoi(str) : 0; + *p = tmpchar; + str = p; + while(*p && !isdigit(*p)) //get the unit + p++; + tmpchar = *p; + *p = '\0'; + if(p - str > 1) { //unit has more than one char + if(!stricmp(str, "year") || !stricmp(str, "year") || !stricmp(str, get_language_string(user, "TIME_YEAR")) || !stricmp(str, get_language_string(user, "TIME_YEARS"))) + unit_multiplikator = 31536000; //60*60*24*365 = 31536000 + else if(!stricmp(str, "month") || !stricmp(str, "months") || !stricmp(str, get_language_string(user, "TIME_MONTH")) || !stricmp(str, get_language_string(user, "TIME_MONTHS"))) + unit_multiplikator = 2592000; //60*60*24*30 = 2592000 + else if(!stricmp(str, "week") || !stricmp(str, "weeks") || !stricmp(str, get_language_string(user, "TIME_WEEK")) || !stricmp(str, get_language_string(user, "TIME_WEEKS"))) + unit_multiplikator = 604800; //60*60*24*7 = 604800 + else if(!stricmp(str, "day") || !stricmp(str, "days") || !stricmp(str, get_language_string(user, "TIME_DAY")) || !stricmp(str, get_language_string(user, "TIME_DAYS"))) + unit_multiplikator = 86400; //60*60*24 = 86400 + else if(!stricmp(str, "hour") || !stricmp(str, "hours") || !stricmp(str, get_language_string(user, "TIME_HOUR")) || !stricmp(str, get_language_string(user, "TIME_HOURS"))) + unit_multiplikator = 3600; //60*60 = 3600 + else if(!stricmp(str, "minute") || !stricmp(str, "minutes") || !stricmp(str, "min") || !stricmp(str, "mins") || !stricmp(str, get_language_string(user, "TIME_MINUTE")) || !stricmp(str, get_language_string(user, "TIME_MINUTES"))) + unit_multiplikator = 60; + else + unit_multiplikator = 1; + } else { + switch(*str) { + case 'y': + unit_multiplikator = 31536000; //60*60*24*365 = 31536000 + break; + case 'M': + unit_multiplikator = 2592000; //60*60*24*30 = 2592000 + break; + case 'w': + unit_multiplikator = 604800; //60*60*24*7 = 604800 + break; + case 'd': + unit_multiplikator = 86400; //60*60*24 = 86400 + break; + case 'h': + unit_multiplikator = 3600; //60*60 = 3600 + break; + case 'm': + unit_multiplikator = 60; + break; + default: + unit_multiplikator = 1; + break; + } + } + total_time += (cvalue * unit_multiplikator); + *p = tmpchar; + str = p; + } + return total_time; +} void init_tools() { diff --git a/tools.h b/tools.h index f34787d..60a590e 100644 --- a/tools.h +++ b/tools.h @@ -29,7 +29,8 @@ int table_set_bold(struct Table *table, int collum, int bold); char **table_end(struct Table *table); void table_free(struct Table *table); -int timeToStr(struct UserNode *user, int seconds, int items, char *buf); +char* timeToStr(struct UserNode *user, int seconds, int items, char *buf); +int strToTime(struct UserNode *user, char *str); void init_tools(); -- 2.20.1