PDA

View Full Version : Catch what users say



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?

voron00
6th June 2017, 19:29
Indeed it is.

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).