SRL Archive - Senior Scripts and Snippets

5-lined AutoResponder


nielsie95

2007-05-29 08:56:04

Hey,

let me be the first who get to post a snippet in here! :)

It's a 5-lined (all lines) autoresponder for the chatbox. It saves the chatlog and it 'remembers' to what and who it has responded.

Features

Easy setup - Very easy question - answer setup, but I guess you guys don't need that :)

EasyCompare - If you set this to false, this makes sure it will only respond to whole words. So it wont see 'hi' in 'hiphop' for example. If you set it true: it just uses the 'old' if Pos(.., ..) <> 0.

FastAdvanced - This speeds things up when not using EasyCompare. It becomes a little les accurate though, but it wont be really noticible.

LinesToCheck - You can set the number of lines the responder has to check for new messages.

RespTime - The responder wont answer to the same message from the same player, unless this time is passed.

2 different kinds of reports - Player specified reports (see when, what player has said), or the normal chatbox-record-log. (option to use both).

RandomRespond - Option to use a random answer out of the list. If you set this to false, it will scroll down the list.



2 kinds of report


Example of the player specified report, it only writes down the messages to which is resonded from each player:

miczek pl
14:56:37 buy 1k willow

ice arrow698
14:56:54 lol gift
14:57:9 i just needed to empty bank lol

kintarna
14:57:13 lol.

12 12 12 13
14:57:14 selling rune scim 35k


Example of the ChatLog, it saves all messages found in the chatbox.


Orc Killer93: Babe
Kintarna: God its posh!!!!!
Tiger Hunt3r: Nice varrock
Slip Knot Ki: W8
Freaktime123: Buyin cowhides
Miczek Pl: Buy 1k willow
Babon 13: Ok
RESPOND: How Much?
Steve6 6 6: Buyin addy axe
Kintarna: =o
Ice Arrow698: Lol gift
RESPOND: =]
Kintarna: :]
Ice Arrow698: I just needed to empty bank lol
RESPOND: Hehe
Kintarna: Lol.
RESPOND: W00tz0rs
12 12 12 13: Selling rune scim 35k
RESPOND: I Have One. Nfs



The Responder:

program AutoRespond;

const EasyCompare = False; // Check for strings in parts of words? Example: If set true it will find 'hi' in 'hiphop'.
FastAdvanced = True; // Speed-up the advanced Compare? Only works if EasyCompare is false.
LinesToCheck = 5; // How many lines to check?
RespTime = 5; // Minimal time between the same message from the same person. (Minutes)
HowToWrite = 3; // 1. Player-Specified 2. All found Messages 3. Both
RandomRespond= False; // True for a random answer. False to scroll down the list.
DebugRespond = True; // True if you want to see what the responder is doing.

type TTime = Record
Hours, Minutes, Seconds, MSec: Integer;
end;

type TRespond = Record
Name: String;
Line: TStringArray;
Time: Array of TTime;
end;

type TPreset = Record
Question, Answer: TStringArray;
AnswerCounter: integer;
end;

var RespArray: Array of TRespond; Presets: Array of TPreset; OldLines: Array [0..10] of String;
Time, TheFile: Integer;

procedure SetQuestions;
var Name: String;
begin
SetArrayLength(Presets, 11);
//Name := Players[CurrentPlayer].Name;

SetArrayLength(Presets[0].Question, 6);
Presets[0].Question[0] := 'hey'
Presets[0].Question[1] := 'hello'
Presets[0].Question[2] := 'hi'
Presets[0].Question[3] := 'ey'
Presets[0].Question[4] := 'yo'
Presets[0].Question[5] := 'howdy'

SetArrayLength(Presets[0].Answer, 10);
Presets[0].Answer[0] := 'good afternoon my friend'
Presets[0].Answer[1] := 'hey'
Presets[0].Answer[2] := 'eyz'
Presets[0].Answer[3] := 'ello'
Presets[0].Answer[4] := 'howdiyadoo'
Presets[0].Answer[5] := 'yo'
Presets[0].Answer[6] := 'eyz'
Presets[0].Answer[7] := 'hello'
Presets[0].Answer[8] := 'howdy'
Presets[0].Answer[9] := 'good day'


SetArrayLength(Presets[1].Question, 11);
Presets[1].Question[0] := 'Lol'
Presets[1].Question[1] := 'hahaha'
Presets[1].Question[2] := 'rofl'
Presets[1].Question[3] := 'omg'
Presets[1].Question[4] := 'hihi'
Presets[1].Question[5] := 'great'
Presets[1].Question[6] := 'lool'
Presets[1].Question[7] := 'omfg'
Presets[1].Question[8] := 'lmao'
Presets[1].Question[9] := 'lmfao'
Presets[1].Question[10]:= 'haha'

SetArrayLength(Presets[1].Answer, 12);
Presets[1].Answer[0] := '=]'
Presets[1].Answer[1] := 'hehe'
Presets[1].Answer[2] := 'w00tz0rs'
Presets[1].Answer[3] := 'wi03t'

Presets[1].Answer[4] := 'nice rofl!!'
Presets[1].Answer[5] := '=[)'
Presets[1].Answer[6] := 'lolol'
Presets[1].Answer[7] := 'haha'
Presets[1].Answer[8] := 'rofl!!'
Presets[1].Answer[9] := 'omg lol'
Presets[1].Answer[10]:= 'mwuhahaha'
Presets[1].Answer[11]:= 'fun!'


SetArrayLength(Presets[2].Question, 2);
Presets[2].Question[0] := 'asdlaksdj'//Players[CurrentPlayer].Name
Presets[2].Question[1] := 'asdlaksdj'//Players[CurrentPlayer].Nick

SetArrayLength(Presets[2].Answer, 8);
Presets[2].Answer[0] := 'what?!'
Presets[2].Answer[1] := 'cmon, yes?'
Presets[2].Answer[2] := 'give it to me'
Presets[2].Answer[3] := 'bring it!'
Presets[2].Answer[4] := 'do I hear my name?'
Presets[2].Answer[5] := 'whats up!'
Presets[2].Answer[6] := 'yeah'
Presets[2].Answer[7] := 'hm..?'


SetArrayLength(Presets[3].Question, 3);
Presets[3].Question[0] := 'what lvl am'
Presets[3].Question[1] := 'combat am i'
Presets[3].Question[2] := 'cmb am i'

SetArrayLength(Presets[3].Answer, 3);
Presets[3].Answer[0] := 'you are '+IntToStr(3 + Random(100))
Presets[3].Answer[1] := 'about '+IntToStr(3 + Random(40))
Presets[3].Answer[2] := '3 lol'


SetArrayLength(Presets[4].Question, 6);
Presets[4].Question[0] := 'autoing'
Presets[4].Question[1] := 'macro'
Presets[4].Question[2] := 'noob'
Presets[4].Question[3] := 'n33b'
Presets[4].Question[4] := 'report him'
Presets[4].Question[5] := 'all report'

SetArrayLength(Presets[4].Answer, 7);
Presets[4].Answer[0] := 'who me?'
Presets[4].Answer[1] := 'rofl ya!'
Presets[4].Answer[2] := 'course he is.'
Presets[4].Answer[3] := '=[)'
Presets[4].Answer[4] := 'My name is doggie dog.'
Presets[4].Answer[5] := 'noob'
Presets[4].Answer[6] := '-.-'


SetArrayLength(Presets[5].Question, 4);
Presets[5].Question[0] := 'how many left'
Presets[5].Question[1] := 'im full'
Presets[5].Question[2] := 'brb'
Presets[5].Question[3] := 'almost full'

SetArrayLength(Presets[5].Answer, 6);
Presets[5].Answer[0] := IntToStr(28 - Random(28))+' left'
Presets[5].Answer[1] := 'almost full';
Presets[5].Answer[2] := 'long way to full inv -.-'
Presets[5].Answer[3] := IntTostr(Random(28))+' in inv now.'
Presets[5].Answer[4] := 'woah! My inv is almost 50% filled :-|'
Presets[5].Answer[5] := 'nearly done'


SetArrayLength(Presets[6].Question, 7);
Presets[6].Question[0] := 'girlfriend'
Presets[6].Question[1] := 'boyfriend'
Presets[6].Question[2] := 'gf'
Presets[6].Question[3] := 'bf'
Presets[6].Question[4] := 'friend'
Presets[6].Question[5] := 'friends'
Presets[6].Question[6] := 'love you'

SetArrayLength(Presets[6].Answer, 10);
Presets[6].Answer[0] := 'boah! not me!!'
Presets[6].Answer[1] := 'yak.';
Presets[6].Answer[2] := 'hmmm...... no!'
Presets[6].Answer[3] := 'no thanks'
Presets[6].Answer[4] := 'i already have one'
Presets[6].Answer[5] := 'sorry no'
Presets[6].Answer[6] := 'i live alone'
Presets[6].Answer[7] := 'leave me alone!'
Presets[6].Answer[8] := 'do you love me?!'
Presets[6].Answer[9] := 'nah =p'


SetArrayLength(Presets[7].Question, 2);
Presets[7].Question[0] := 'trade'
Presets[7].Question[1] := 'wishes to trade'

SetArrayLength(Presets[7].Answer, 9);
Presets[7].Answer[0] := 'what?'
Presets[7].Answer[1] := 'what are you doing..'
Presets[7].Answer[2] := 'go away!!'
Presets[7].Answer[3] := 'no thanks'
Presets[7].Answer[4] := 'why trade?'
Presets[7].Answer[5] := 'leave me alone!'
Presets[7].Answer[7] := 'im setting trade/compete on off!!'
Presets[7].Answer[8] := 'dont trade plz'


SetArrayLength(Presets[8].Question, 6);
Presets[8].Question[0] := 'buying'
Presets[8].Question[1] := 'selling'
Presets[8].Question[2] := 'trading'
Presets[8].Question[3] := 'for sale'
Presets[8].Question[4] := 'buy'
Presets[8].Question[5] := 'sell'

SetArrayLength(Presets[8].Answer, 4);
Presets[8].Answer[0] := 'how much?'
Presets[8].Answer[1] := 'I have one. nfs'
Presets[8].Answer[2] := 'Im not buying anything!!'
Presets[8].Answer[3] := 'im selling nothing'


SetArrayLength(Presets[9].Question, 4);
Presets[9].Question[0] := 'Levels'
Presets[9].Question[1] := 'lvls'
Presets[9].Question[2] := 'lvl'
Presets[9].Question[3] := 'level'

SetArrayLength(Presets[9].Answer, 7)
Presets[9].Answer[0] := 'i am '+IntToStr(Random(50))
Presets[9].Answer[1] := 'i think it was '+IntToStr(Random(30))
Presets[9].Answer[2] := '99!!'
Presets[9].Answer[3] := IntToStr(Random(70))
Presets[9].Answer[4] := 'whats yours'
Presets[9].Answer[5] := 'check highscores.'
Presets[9].Answer[6] := 'way to low'


SetArrayLength(Presets[10].Question, 4);
Presets[10].Question[0] := 'bye'
Presets[10].Question[1] := 'cya'
Presets[10].Question[2] := 'ltr'
Presets[10].Question[3] := 'later'

SetArrayLength(Presets[10].Answer, 5);
Presets[10].Answer[0] := 'cya';
Presets[10].Answer[1] := 'good bye'
Presets[10].Answer[2] := 'au revoir..'
Presets[10].Answer[3] := 'byebye'
Presets[10].Answer[4] := 'ltr'

end;

function LoadSpecialChars: TStringArray;
begin
SetArrayLength(Result, 5);
Result[0] := ' '
Result[1] := ','
Result[2] := '.'
Result[3] := '?'
Result[4] := '!'
if not FastAdvanced then
begin
SetArrayLength(Result, 25);
Result[5] := ')'
Result[6] := '('
Result[7] := '@'
Result[8] := '#'
Result[9] := '$'
Result[10] := '%'
Result[11] := '^'
Result[12] := '&'
Result[13] := '*'
Result[14] := '-'
Result[15] := '_'
Result[16] := '='
Result[17] := '+'
Result[18] := '`'
Result[19] := '~'
Result[20] := '|'
Result[21] := ';'
Result[22] := ':'
Result[23] := '\'
Result[24] := '/'
end;
end;

function GetCurrentTime: TTime;
var Hour, Mins, Sec, MSec: Word; Temp: String;
begin
DecodeTime(Now, Hour, Mins, Sec, MSec);
Result.Msec := GetSystemTime;
Temp := (Padz(IntToStr(Hour), 2) + ':' + Padz(IntToStr(Mins), 2) + ':' + Padz(IntToStr(Sec), 2))
Result.Hours := StrToInt(GetNumbers(Copy(Temp, 0, Pos(':', Temp) -1)));
Temp := Copy(Temp, (Pos(':', Temp) +1), Length(Temp));
Result.Minutes := StrToInt(GetNumbers(Copy(Temp, 0, Pos(':', Temp) -1)));
Temp := Copy(Temp, Pos(':', Temp) +1, Length(Temp));
Result.Seconds := StrToInt(GetNumbers(Copy(Temp, 0, Length(Temp))));
end;

procedure AddNewLine(Numb: integer; Msg: String);
begin
SetArrayLength(RespArray[Numb].Line, GetArrayLength(RespArray[Numb].Line) +1);
SetArrayLength(RespArray[Numb].Time, GetArrayLength(RespArray[Numb].Time) +1);
RespArray[Numb].Line[GetArrayLength(RespArray[Numb].Line) -1] := LowerCase(Msg);
RespArray[Numb].Time[GetArrayLength(RespArray[Numb].Time) -1] := GetCurrentTime;
end;

procedure AddName(Name: String);
begin
SetArrayLength(RespArray, GetArrayLength(RespArray) +1);
RespArray[GetArrayLength(RespArray) -1].Name := LowerCase(Name);
end;

function GetLineName(Line: integer; var Name: string): Boolean;
var i, x, y: integer;
begin
if FindColor(x, y, 0, 21, 415 - (14 * Line), 50, 425 - (14 * Line)) then
begin
Name := Trim(GetTextAtEx(21, 415 - (14 * Line), 0, SmallChars, False, False, 0, 1, 0, 80, False, tr_AllChars));
i := Pos(':', Name);
if i <> 0 then
begin
Delete(name, i, i);
Result := True;
end;
end else
begin
if FindColorTolerance(x, y, 8388736, 21, 415 - (14 * Line), 50, 425 - (14 * Line), 50) then //Trade
Name := Trim(GetTextAtEx(21, 415 - (14 * Line), 0, SmallChars, False, False, 0, 1, 8388736, 80, False, tr_AllChars));
i := Pos('wishes', Name);
if i <> 0 then
begin
Name := Copy(name, 0, i -1);
Result := True;
end;
end;
end;

function GetLineChat(Line: integer; var Chat: string): Boolean;
var x, y: integer;
begin
if FindColorTolerance(x, y, 16711680, 21, 415 - (14 * Line), 110, 425 - (14 * Line), 50) then
begin
Chat := Trim(GetTextAtEx(21, 415 - (14 * Line), 0, SmallChars, False, False, 0, 1, 16711680, 80, False, tr_AllChars));
Result := Length(Chat) > 0;
end else
if FindColorTolerance(x, y, 8388736, 21, 415 - (14 * Line), 110, 425 - (14 * Line), 50) then //Trade
begin
Chat := 'wishes to trade';
Result := True;
end else
end;

procedure ShiftOldLines(NewMsg: String);
var i: integer;
begin
for i := 9 downto 1 do
begin
OldLines[i] := OldLines[i -1];
//WriteLn(OldLines[i]+' word '+ OldLines[i -1]);
end;
OldLines[0] := NewMsg;
end;

function LinesToDo(var Names, Chats: TStringArray): Boolean;
var i, c: integer; Name, Chat: String; DontContinue: Boolean;
begin
for i := 0 to LinesToCheck -1 do
if GetLineName(i, Name) and GetLineChat(i, Chat) then
begin
for c := 0 to 9 do
if LowerCase(Name)+': '+LowerCase(Chat) = LowerCase(OldLines[c]) then begin DontContinue := True; Break; end;
if DontContinue then Break;
if (HowToWrite > 1) then WriteFileString(TheFile, Name+': '+Chat+chr(13));
//WriteLn(Name+': '+Chat);
SetArrayLength(Names, GetArrayLength(Names) +1);
Names[GetArrayLength(Names) -1] := LowerCase(Name);
SetArrayLength(Chats, GetArrayLength(Chats) +1);
Chats[GetArrayLength(Chats) -1] := LowerCase(Chat);
ShiftOldLines(LowerCase(Name)+': '+LowerCase(Chat));
end;
Result := GetArrayLength(Names) > 0;
end;

function Compare(Msg, Chat: String): Boolean;
var i, c, arLength: integer; SpecialChars: TStringArray; TempStr: String;
begin
if EasyCompare then Result := Pos(LowerCase(Msg), LowerCase(Chat)) <> 0 else
begin
SpecialChars := LoadSpecialChars;
arLength := GetArrayLength(SpecialChars) -1;
for i := 0 to arLength do
for c := 0 to arLength do
begin
TempStr := LowerCase(SpecialChars[i]+Msg+SpecialChars[c]);
if Pos(TempStr, ' '+Chat+' ') <> 0 then
begin
Result := True;
//WriteLn('Match!');
Exit;
end;
end;
end;
end;

function NameInArray(Name: String; var Numb: integer): Boolean;
var i, arLength: integer; TempName: String;
begin
arLength := GetArrayLength(RespArray) -1;
TempName := LowerCase(Name);
for i := 0 to arLength do
begin
if Pos(TempName, LowerCase(RespArray[i].Name)) <> 0 then
begin
Numb := i;
Result := True;
Exit;
end;
end;
end;

function LineInArray(Msg: String; Numb: Integer; var i: integer): Boolean;
var arLength: integer; TempLine: String;
begin
arLength := GetArrayLength(RespArray[Numb].Line) -1;
TempLine := LowerCase(Msg);
for i := 0 to arLength do
begin
if Compare(TempLine, LowerCase(RespArray[Numb].Line[i])) then
begin
Result := True;
Exit;
end;
end;
end;

procedure WriteMessage(Numb, i: Integer);
begin
WriteLn(RespArray[Numb].Name+': '+
RespArray[Numb].Line[i]+' - '+
IntToStr(((GetSystemTime - RespArray[Numb].Time[i].MSec) /1000) /60)+
' min[s] ago.');
end;

procedure RespondTo(c: Integer);
var i: integer;
begin
if RandomRespond then i := Random(GetArrayLength(Presets[c].Answer)) else
begin
i := Presets[c].AnswerCounter;
Presets[c].AnswerCounter := i + 1;
if (i >= GetArrayLength(Presets[c].Answer) -1) then i := 0;
end;
if DebugRespond then WriteLn('TypeSend: '+Capitalize(Presets[c].Answer[i]));
if (HowToWrite > 1) then WriteFileString(TheFile, ' RESPOND: '+Capitalize(Presets[c].Answer[i])+chr(13));
//TypeSend(Presents[c].Answer[i]);
end;

procedure Respond;
var a, b, c, i, x: integer; Names, Chats: TStringArray;
begin
if not LinesToDo(Names, Chats) then Exit;

for a := 0 to GetArrayLength(Chats) -1 do
for b := 0 to GetArrayLength(Presets) -1 do
for c := 0 to GetArrayLength(Presets[b].Question) -1 do
if Compare(Presets[b].Question[c], Chats[a]) then
begin
//if LowerCase(Names[a]) <> LowerCase(Players[CurrentPlayer].Name) then
if NameInArray(Names[a], i) then
begin
if LineInArray(Chats[a], i, x) then
begin
if GetSystemTime - RespArray[i].Time[x].MSec >= RespTime * 1000 * 60 then
begin
RespondTo(b);
RespArray[i].Time[x] := GetCurrentTime;
if DebugRespond then WriteLn('Time elapsed, responding again to '+ Capitalize(Presets[b].Question[c]));
end;
//WriteLn('Already responded to preset: '+Capitalize(Presets[b].Question[c]));
//WriteMessage(i, x);
end else
begin
AddNewLine(i, Chats[a]);
if DebugRespond then WriteLn('Added new line to '+Capitalize(Names[a])+' : '+Capitalize(Chats[a]));
RespondTo(b);
Exit;
end;
end else
begin
AddName(Names[a]);
AddNewLine(GetArrayLength(RespArray) -1, Chats[a]);
if DebugRespond then WriteLn('Added new name and line: '+Capitalize(Names[a])+' : '+Capitalize(Chats[a]));
RespondTo(b);
Exit;
end;
end;
end;

procedure WriteRespondFile;
var i, c, ThisFile: integer;
begin
ThisFile := ReWriteFile(AppPath + 'PlayerChatLog.txt', False);
for i := 0 to GetArrayLength(RespArray) -1 do
begin
WriteFileString(ThisFile,' '+RespArray[i].Name+chr(13));
for c := 0 to GetArrayLength(RespArray[i].Line) -1 do
begin
WriteFileString(ThisFile, ' '+IntToStr(RespArray[i].Time[c].Hours)+':'+IntToStr(RespArray[i].Time[c].Minutes)+':'+IntToStr(RespArray[i].Time[c].Seconds)+' '+RespArray[i].Line[c]+chr(13));
end;
WriteFileString(ThisFile,' '+chr(13));
end;
CloseFile(ThisFile);
end;

begin
TheFile := ReWriteFile(AppPath + 'ChatLog.txt', False);
SetQuestions;
repeat
Time := GetSystemTime;
Respond;
//writeLn('Respond took '+IntToStr(GetSystemTime - Time)+' msec.');
Wait(1000);
Time := GetSystemTime;
if HowToWrite <> 2 then WriteRespondFile;
//writeLn('Writing took '+IntToStr(GetSystemTime - Time)+' msec.');
until False;
end.

shaunthasheep

2007-05-29 09:28:21

hmm. i like it. i wouldn't call it a 5-line autoresponder tho lol. Unless u mean like if it was included into a script. then yea.

but on these

Presets[3].Answer[0] := 'you are '+IntToStr(3 + Random(100))
Presets[3].Answer[1] := 'about '+IntToStr(3 + Random(40))

Presets[9].Answer[0] := 'i am '+IntToStr(Random(50))
Presets[9].Answer[1] := 'i think it was '+IntToStr(Random(30))
Presets[9].Answer[3] := IntToStr(Random(70))

Presets[5].Answer[0] := IntToStr(28 - Random(28))+' left'
Presets[5].Answer[3] := IntTostr(Random(28))+' in inv now.'

they'll always be the same, so the script that may use these may want to call SetQuestions after done talking or before talking, so it doesn't always say "28 in inv now." and when it has 5 and isn't leaving the tree =p

nielsie95

2007-05-29 10:36:34

Thanks. Yes I know, but normally you don't have to respond much to those questions. And with 5-lined I mean the whole chatbox :p

shaunthasheep

2007-05-29 10:54:16

Oh. Lol… =S Anyways good work there.

tarajunky

2007-05-29 11:25:43

Is that your character name? :)

nielsie95

2007-05-29 12:46:54

asdlaksdj? :p
No, my character names don't even look like that..
I just tagged out the SRL-things (to make it work stand alone). I also tagged out typesend :p. So if you want this to work you need to add SRL :)