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
Printable View
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
through the callback_playercommand
But that's libcod function, isnt that?
Indeed it is.
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:
Its far from perfect but it gets the job done.PHP Code:
// 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;
}
Not that i'm aware of (apart from libcod).