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:
Example of the ChatLog, it saves all messages found in the chatbox.
The Responder:
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.