croni1012
6th June 2017, 13:46
Hi,
Is there a possibility to catch what users say to others? I know i can read the log, but is there any other option? If not, how can I read JUST the last line of a file?
nyaa
IzNoGoD
6th June 2017, 15:24
through the callback_playercommand
croni1012
6th June 2017, 17:09
But that's libcod function, isnt that?
stevomitric
6th June 2017, 20:23
how can I read JUST the last line of a file?
With the built-in functions you cant. You would need to read the whole file in order to get to the last line. This is very ineffective as log files can get huge (we're talking in MB).
In my old script i deleted the log every time i read it. Take a look:
// stEvo
init() {
level.logName = "log.log";
level.logTimeRefresh = 1;
level.triggerString = "!"; // can be any multi-lenght string
setCvar("g_log", "scriptdata/"+level.logName); //
setCvar("g_logSync", 1); // You may need double restart if u havent set the cvars before
thread main_loop();
}
main_loop() {
wait 10;
while (1) {
clearLog();
wait level.logTimeRefresh;
filenum = OpenFile( level.logName, "read" );
if (filenum == -1) continue;
commas = freadln(filenum);
while (commas > 0) {
for (i = 0; i < commas; i++) {
response = fgetarg(filenum,i);
chr = 0;
type = "";
for (; chr < response.size; chr++)
if (response[chr] != ";") type += response[chr]; else break; chr ++;
guid = "";
for (; chr < response.size; chr++)
if (response[chr] != ";") guid += response[chr]; else break; chr ++;
id = "";
for (; chr < response.size; chr++)
if (response[chr] != ";") id += response[chr]; else break; chr ++;
name = "";
for (; chr < response.size; chr++)
if (response[chr] != ";") name += response[chr]; else break; chr ++;
message = "";
for (; chr < response.size; chr++)
if (response[chr] != ";") message += response[chr]; else break; chr ++;
if (validType(type) && validMessage(message))
thread doMessage(fixMessage(ToLower(message)), guid, id, name);
}
commas = freadln(filenum);
}
closeFile(filenum);
}
}
doMessage(message, guid, id, name) {
if (startsWith(message, "id"))
getId(id, message);
else if (startsWith(message, "kick"))
kickPlayer(id, message);
else
getPlayerByNum(int(id)) iprintlnbold("Invalid Command.");
}
//************************************************** ************************************************** **************
kickPlayer(id, message) {
player = getPlayerByNum(int(id));
//if (isDefined(player.admin) && !player.admin) { player iprintlnbold("You are not admin."); return;} // Uncomment
name = ""; chr = 0;
for (; chr < message.size; chr ++) if (message[chr] == " ") break; chr ++;
for (; chr < message.size; chr ++) name += message[chr];
playerToKick = getPlayerByName(name);
if (!isPlayer(playerToKick)) { player iprintlnbold("To many or no matches: " + name); return;}
player SayAll("[^1BOT^7]: Kicked player: " + playerToKick.name ); wait 2;
kick(playerToKick getEntityNumber());
}
getId(id, message) {
player = getPlayerByNum(int(id));
//if (isDefined(player.admin) && !player.admin) { player iprintlnbold("You are not admin."); return;} // Uncomment
name = ""; chr = 0;
for (; chr < message.size; chr ++) if (message[chr] == " ") break; chr ++;
for (; chr < message.size; chr ++) name += message[chr];
players = getEntArray( "player", "classname" );
for (i = 0; i < players.size; i++)
if (IsSubStr(ToLower(players[i].name), name) ) {
player SayAll("[^1BOT^7]: " + players[i].name + " ^7 - ID: ^1#" + players[i] getEntityNumber() );
wait 1;
}
}
//************************************************** ************************************************** **************
clearLog() {
filenum = OpenFile( level.logName, "write" );
closeFile(filenum);
}
validMessage(message) {
if (message.size < 3) return 0;
return (GetSubStr(message, 0, level.triggerString.size) == level.triggerString || GetSubStr(message, 1, level.triggerString.size+1) == level.triggerString);
}
validType(type) {
return (type.size > 2 && IsSubStr(type, "say") );
}
fixMessage(message) {
if (GetSubStr(message, 0, level.triggerString.size) == level.triggerString) return GetSubStr(message, level.triggerString.size, message.size);
if (GetSubStr(message, 1, level.triggerString.size+1) == level.triggerString) return GetSubStr(message, level.triggerString.size+1, message.size);
return "";
}
getPlayerByNum(num) {
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
if (players[i] getEntityNumber() == num)
return players[i];
}
getPlayerByName(name) {
// -2 - Invalid parameter
// -1 - No player found by that name
// 0 - More then 1 player found
if (name.size == 0 || name == " ") return -2;
if (name[0] == "#") {
name = GetSubStr(name, 1, name.size);
id = int(name);
player = getPlayerByNum(id);
if (IsPlayer(player)) return player; return -1;
}
players = getentarray("player", "classname");
player = -1;
for(i = 0; i < players.size; i++)
if (IsSubStr(ToLower(players[i].name), name))
if (player != -1) return 0;
else player = players[i];
return player;
}
startsWith(str, start) {
if (start.size > str.size) return 0;
for (i = 0; i < start.size; i++)
if (str[i] != start[i]) return 0;
return 1;
}
Its far from perfect but it gets the job done.
I know i can read the log, but is there any other option?
Not that i'm aware of (apart from libcod).
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions Inc. All rights reserved.