Страница 1 из 6
МиниГайд по плагину likeHuman /интеллектуальный автоответчик
Добавлено: Вс ноя 19, 2006 7:37 am
b0tter
Оригинал на английском языке находится
здесь
Попробовал написать на основе этого некий мини-гайд
Надеюсь это поможет начинающим боттерам снизить шанс бана.
Итак, плагин likeHuman-это плагин для расширения функции autoresponse. Он предназначен для ответов на различные сообщения при выполнении определенных условий. Условиями могут являться текст получаемого сообщения, количество получаемых сообщений определенного типа, а также нежелательные сообщения. Пологается, что это работает также с selfconditions. Также в плагине предусмотрена задержка, будто бы ответ печатается, которую можно изменить, отредактировав строку в Плагине. Для этого открываем в текстовом редакторе САМ плагин и находим следующую строку:
Код: Выделить всё
$likeArgs->{timeout} = (0.5 + rand(1)) + (length($answer) / $typeSpeed);
Чтобы изменить задержку, необходимо увеличить $typeSpeed.
Описание допустимых параметров Плагина:
Код: Выделить всё
likeHumanOn (0|1) Вырубает|Врубает Плагин
likeHumanInLockOnly (0|1) Врубает(1) ответы только на lockMap
likeHumanConsole (0|1) Врубает(1) консольные сообщения
likeHumanIgnore <список имен, резделенных точкой с запятой, или регулярное выражение> Этих товарищей бот будет игнорить
likeHumanStopAfter <количество максимальных сообщений для одного игрока> После этого бот перестает отвечать
likeHumanRealIgnoreOn (0|1) Этот параметр включает игнор если достигнуто likeHumanStopAfter или выполнено условие endings, после которого бот перестает "разговаривать" с игроком
-
Использования Плагина (это прописываем в config.txt):
Код: Выделить всё
likeHuman {
questions <предполагаемые сообщения, на которые бот будет отвечать, разделенные точкой с запятой или регулярное выражение>
answers <ответы, разделенные точкой с запятой>
onPub (0|1) #отвечать в паблик-чат (1-да)
distance <max> #максимальная дистанция, на которой бот будет отвечать на паблик-сообщения
onSystem (0|1) #если это значение установлено в (1), бот будет проврять вопросы в системных сообщениях
onGuild (0|1) # если этот параметр задан (1), бот будет отвечать в гильд-чат
onParty (0|1) #если этот параметр задан (1), бот будет отвечать в пати-чат
onPM (0|1) #если этот параметр задан (1), бот будет отвечать на приваты
chatCount <range> #сколько раз будем отвечать одному юзеру(КАК ИСПОЛЬЗОВАТЬ ЗАВИСИТ ОТ ВЕРСИИ ОПЕНКОРЫ)
endings <список фраз, разделенных точкой с запятой как закончим разговор>
}
-
Теперь небольшой пример (прописываем в конфиг.тхт):
Код: Выделить всё
## like human
likeHumanOn 1
likeHumanIgnore /GM_/
likeHuman {
questions /прив/;превед;хай;hi;hello
answers прива;прив;здароф
onPub 1
onSystem 0
onGuild 1
onParty 1
onPM 1
chatCount <2
endings
}
likeHuman {
questions дароф, хелоу
answers =);:);^^
onPub 1
onSystem 0
onGuild 1
onParty 1
onPM 1
chatCount 2
endings
}
likeHuman {
questions / бот/;/ bot/
answers сам ты бот :(;эээ;=(;O_o
onPub 1
onSystem 0
onGuild 0
onParty 0
onPM 1
chatCount <2
endings задрал;отвали;пашол в жопу
}
Как это будет выглядить ?
Юзер: привет)
Бот: прива
Юзер:дароф
Бот: ^^
Юзер: привет
Юзер: дароф
Юзер: ты бот
Бот: сам ты бот
Юзер:привет
Юзер: ты бот!!!
Бот: пашол в жопу
Юзер: чозанах?
Бот больше ему не ответит
---------------------
Очень надеюсь что это буде кому-то полезно
Добавлено: Пт фев 02, 2007 10:11 pm
kLabMouse
Отделил кучу Мусора. Попрошу попусту не флудить!
А так-же добавить недостающие части топика отсудова:
viewtopic.php?t=1208
Добавлено: Пн фев 12, 2007 9:53 pm
Ahilles666
Проблема стандартна : непашет... Версия коры 1.9.3 , плага 3.0.1.
В конфе :
######## like human ########
likeHumanOn 1
likeHumanConsole 0
likeHumanInLockOnly 1
likeHumanIgnore /GM_/
likeHumanStopAfter 10
likeHumanRealIgnore 1
likehuman {
questions /прив/;превед;хай;hi;hello
answers прива;прив;здароф
onPub 1
onSystem 0
onGuild 1
onParty 1
onPM 1
chatCount <2
endings
}
likeHuman {
questions / бот/;/ bot/
answers О_о,внатуре?);Да ты моск, всё ушла гмам сдаваться)));Плин а я незаметила);А ты уверен?;пнх;Сам ты бот;
onPub 1
onSystem 0
onGuild 0
onParty 0
onPM 1
chatCount <2
endings задрал;отвали;пашол в жопу
}
Остановился на написании этого - попробовал потестить-молчит...все варианты в теме пробовал-невыходит.
Если где то по нубски налажал-пните и ткните носом.
Добавлено: Пн фев 12, 2007 10:20 pm
miniBot
чуть выше постом есть ссылка, на отстреляный мусор, почитай, и будет тебе счастье.
Добавлено: Пн фев 12, 2007 10:58 pm
Jacob
Возникла проблема Misc.pm line 2054. при ответе лайкхумана
В поиске нашел ответы типа проблема решена, тема закрыта и т.п.
самое информативное:
Добавлено: Чт Фев 01, 2007 7:57 am Заголовок сообщения:
--------------------------------------------------------------------------------
Цитата:
--error----
sendPrivateMsg
Misc.pm line 2054
--error----
ты не понял. С ошибкой я разобрался. Просто переставил плаг раза 2-3. Потом в боте прописал plugin load all. И заработало.
А конфликтует болталка, когда включен алетрсаунд. Т.е. ошибки нет, а кора молчит и не отвечает.
--------------------------------------------------------------------------------
Тока я не пойму "переустановить плагин 2-3 раза" это много много раз его скопировать в папку plugin????
plugin load all записать в config.txt?или в кансоли набрать?
Вобщем, алертсаунд удалил совсем(из конфига и из папки плагинов), от лайкхумана оставил тока 1 блок в конфиге(который на привет отвечает привет), и еще написал plugin load all в config.txt,и в консоли набрал до кучи. не помогает.
После ошибки в кансоли пишется следующее:
The error message is:
Can`t locate method "SendPrivateMsg" via package
"Network::DirectConnection" at C:/RObot/src/Misc.pm line 2054.
ну а текст файла error.txt при этой ошибке уже много раз выкладывали
Добавлено: Вт фев 13, 2007 12:21 am
Ahilles666
2 miniBot
Я его перечитал раз 20...алерт саунд отрубал, конф переписывал,копировал...чего только непробовал-молчит и всё... я конечно дурак, но просто непонимаю что нетак...
З.Ы.
РТФМ непоможет, я их прочитал)
Добавлено: Вт фев 13, 2007 1:44 am
kLabMouse
Господа. ЛайкХуман давно поправили. И АлертСаунд тоже!
Вообще что вы парите себе и другим мозг? Идёте на главный форум, и задаёте там свои дурацкие вопросы... там вас точно пошлют по дальше.
Добавлено: Вт фев 13, 2007 2:05 am
Kaiser
лан я задам
почитал про регулярные выражения и возник вопрос)
работает ... но если добавить синтаксис
эта конструкция не хочет работать
проблема в лайке?
Добавлено: Вс фев 18, 2007 12:02 pm
Danil
Прочитал весь форум но ненашел подобного...
Я хочу сделать так что в likehuman'е при определенном"answers" бот уходил в reconnect. Как это сделать? Подскажите пожалуйста.
Зараннее спасибо
Добавлено: Вс фев 18, 2007 9:02 pm
Бадум
Здравствуйте.
Суть проблемы - поставил плагин, вбил в конфиг вот это:
likeHumanOn 1
likeHumanIgnore /GM_/
likeHuman {
questions /прив/;превед;хай;ку;/есть/;/знаешь/;/где/;/как/;/что/;
answers привет;медвед;хой;ку;неа;незнаю;непомню;смотри на форуме roinfo.ru;незнаю
onPub 1
distance 3
onSystem 0
onGuild 0
onParty 0
onPM 1
chatCount 10
endings всё, отстань; не мешай плиз качаца; дай покачаться спокойно; всё, я занят; не мешай плз; извини у меня важный разговор в привате, не мешай плиз;
}
- чисто проверить работоспособность. Захожу пристом, пишу боту "как пройти в библиотеку?". Через секунд 10 вылетает ошибка:
OpenKore version 1.9.3
@ai_seq = likeHuman move route attack route
conState = 5
Loaded plugins:
plugins/alertsound.pl (alertsound)
plugins/doCommand.pl (doCommand)
plugins/kadiliman.pl (kadiliman)
plugins/likehuman.pl (likehuman)
plugins/macro.pl (macro)
plugins/patchConnect.pl (patchconnect)
plugins/ropp.pl (ppengine)
Error message:
Can't locate object method "sendPrivateMsg" via package "Network::DirectConnection" at C:/BOTS/Swordman-pupa/src/Misc.pm line 2056.
Stack trace:
Can't locate object method "sendPrivateMsg" via package "Network::DirectConnection" at C:/BOTS/Swordman-pupa/src/Misc.pm line 2056
Misc::sendMessage('Network::DirectConnection=HASH(0x2a90b7c)', 'pm', 'извини у меня важный разговор в привате, не мешай плиз', 'AntLion') called at C:/BOTS/Swordman-pupa/plugins/likehuman.pl line 301
likehuman::AI_post('AI_post', 'undef', 'undef') called at C:/BOTS/Swordman-pupa/src/Plugins.pm line 378
Plugins::callHook('AI_post') called at C:/BOTS/Swordman-pupa/src/AI/CoreLogic.pm line 191
AI::CoreLogic::iterate() called at C:/BOTS/Swordman-pupa/src/functions.pl line 541
main::mainLoop_initialized() called at C:/BOTS/Swordman-pupa/src/functions.pl line 65
main::mainLoop() called at C:/BOTS/Swordman-pupa/src/Interface.pm line 74
Interface::mainLoop('Interface::Console::Win32=HASH(0x23cba14)') called at openkore.pl line 96
main::__start() called at start.pl line 127
Died at this line:
} elsif ($type eq "pm") {
* $sender->sendPrivateMsg($user, $msg);
Поискал по форуму - схожие ошибки встречаются, но есть отличия.
А если и есть описания моей проблемы - ответа четкого нет.
Вот например.
viewtopic.php?p=11461&highlight=sendprivatemsg#11461
Пытался отключать АлертСаунд - не помогло.
Добавлено: Пн фев 19, 2007 1:24 am
kLabMouse
Господа. Проблемы обговариваются в вопросах по опенкоре!
готовые решения ищем здеаь.
Добавлено: Вт фев 20, 2007 8:33 pm
DraG
Аналогичная ситуация, при попытке бота написать автответ, слетает в ошибку..подправка плагина, и удаление алертсаунда не помогает. сборка коры последняя. и может уже вхатит придиратсья к словам, и стоит дать ответ?(просьба к тем кто знает)
Добавлено: Вт фев 20, 2007 10:54 pm
piroJOKE
DraG
kLabMouse
Бадум
Проблема именно в лайкХумане? При его удалении ошибка пропадает?
Добавлено: Ср фев 21, 2007 2:58 am
b0tter
Странно, исправленную версию видел когда-тона форуме.
SVN 5506 Проблем не возникает.
Вот она на всякий случай:
Код: Выделить всё
package likehuman;
#
# likeHuman v 3.0.1
#
# This plugin was made by taking some parts of kadiliman's ChatBot and the "match" sub of hakore's ReactOnNPC plugins.
# Change it as your will.
# This plugin is FREE, so you can do whatever(yes, whatever) you want with it.
# By Buggless
#
# Working on openkore 1.9.x and 1.6.8+
#
# It will run only when AI is on.
# An overlap on ChaCount conditions on same messages will cause last block to replace the first response (former one).
# Usage:
# on config.txt should include:
#
# likeHumanOn (0|1) is a flag to turn on (1) and off (0) plugin
# likeHumanInLockOnly (0|1) is a flag to turn on (1) and off (0) responses only on lockMap
# likeHumanConsole (0|1) is a flag to turn on (1) and off (0) console messages
# likeHumanIgnore <semicolon_separated_list_of_names_also_regex>
# likeHumanStopAfter <number_of_max_responses_to_same_user>
# likeHumanRealIgnoreOn (0|1) is a flag to turn on (1) and off (0) the ignore openkore option after
# "likeHumanStopAfter" max responses are reached or in case "endings" condition
# is accomplished.
#
# likeHuman {
# questions <semicolon_separated_possible_from_msg_also_regex>
# answers <semicolon_separated_possible_responses>
# onPub (0|1) is a flag to turn set (1) or unset (0) this questions check on Public Chat
# distance <max distance> is the max distance to the char that makes the pubMsg, you will cosider to make a response to
# onSystem (0|1) is a flag to turn set (1) or unset (0) this questions check on System Chat
# onGuild (0|1) is a flag to turn set (1) or unset (0) this questions check on Guild Chat
# onParty (0|1) is a flag to turn set (1) or unset (0) this questions check on Party Chat
# onPM (0|1) is a flag to turn set (1) or unset (0) this questions check on Private Msg Chat
# chatCount <range> is a range to set how many times you will response to the same user
# endings <semicolon_separated_possible_close_chat_responses>
# }
#
use strict;
use Plugins;
use Globals;
use Log qw(message warning error debug);
use Misc;
use Network;
use Network::Send;
use Utils;
my %chatcount;
my %chatended;
my @ignorelist;
my %totalcount;
my $questionlist;
my @questions;
my $answerlist;
my @answers;
my $answer;
my $sanswer = 0;
my $endingslist;
my @endings;
my $prefix = "likeHuman_";
Plugins::register('likehuman', 'Human-Chat-Like behavior bot', \&Unload);
my $hooks = Plugins::addHooks(
['packet_pubMsg', \&onMsg, undef],
['packet_privMsg', \&onMsg, undef],
['packet_selfChat', \&onMsg, undef],
['packet_partyMsg', \&onMsg, undef],
['packet_guildMsg', \&onMsg, undef],
['AI_post', \&AI_post, undef]
);
sub Unload {
Plugins::delHooks($hooks);
}
sub onMsg {
return unless ($main::conState == 5);
return if (!$config{'likeHumanOn'});
return unless $AI;
return if (AI::inQueue("likeHuman"));
return if (($config{'likeHumanInLockOnly'} > 0) && ($field{name} ne $config{lockMap}));
debug " Starting Check of Chat Message.\n", "likeHuman";
my ($packet, $args) = @_;
my $likeMsgUsr = (($packet eq 'packet_selfChat') ? ($args->{user}) : ($args->{MsgUser}));
my $likeMsg = (($packet eq 'packet_selfChat') ? ($args->{msg}) : ($args->{Msg}));
if ($config{'likeHumanStopAfter'}){
debug " Checking if Message Received by User '$likeMsgUsr' are more than $config{'likeHumanStopAfter'}.\n", "likeHuman";
debug " Received are '$totalcount{$likeMsgUsr}'.\n", "likeHuman";
if ($totalcount{$likeMsgUsr} > $config{'likeHumanStopAfter'}) {
if ($config{'likeHumanRealIgnoreOn'} == 1) {
Commands::cmdIgnore "ignore","1 $likeMsgUsr";
}
return;
};
$totalcount{$likeMsgUsr}++;
}
if ($config{'likeHumanIgnore'}){
debug " Checking if User '$likeMsgUsr' should be ignored.\n", "likeHuman";
my $ignorel;
$ignorel = $config{'likeHumanIgnore'};
@ignorelist = split(/\s*;+\s*/, $ignorel);
for (my $ii = 0; $ii < @ignorelist; $ii++) {
next unless defined $ignorelist[$ii];
if (match($ignorelist[$ii],$likeMsgUsr)){
debug " Match Found ['$ignorelist[$ii]'] vs. ['$likeMsgUsr'] - Ignoring.\n", "likeHuman";
if ($config{'likeHumanRealIgnoreOn'} == 1) {
Commands::cmdIgnore "ignore","1 $likeMsgUsr";
}
return;
};
}
}
for (my $i = 0; (exists $config{$prefix.$i}); $i++) {
debug " Checking for likeHuman Block '$i'.\n", "likeHuman";
debug " Checking if it is not our own Message.\n", "likeHuman";
return if ($likeMsgUsr eq $char->{name});
debug " Checking if Chat was ended with User '$likeMsgUsr'.\n", "likeHuman";
return if ($chatended{$likeMsgUsr} == 1);
$questionlist = $config{$prefix .$i. "_questions"};
$answerlist = $config{$prefix .$i. "_answers"};
@questions = split(/\s*;+\s*/, $questionlist);
@answers = split(/\s*;+\s*/, $answerlist);
$answer = $answers[rand(@answers)];
$endingslist = $config{$prefix .$i. "_endings"};
@endings = split(/\s*;+\s*/, $endingslist);
debug " Values are:\nQuestions '$questionlist'\nAnswers '$answerlist'\nEndings '$endingslist'.\nRandom Answer '$answer'.\n", "likeHuman";
my $type;
debug " Checking Message Channel.($packet)\n", "likeHuman";
if (($packet eq 'packet_pubMsg') && $config{$prefix.$i."_onPub"}) {
debug " Public Channel Detected.\n", "likeHuman";
$sanswer=likeCheckMsg($likeMsgUsr,$likeMsg,$i);
$type = "c";
if ($config{$prefix.$i."_distance"}) {
debug " Checking distance.\n", "likeHuman";
my $actor;
if ($args->{pubID}) {
if ((substr($Settings::VERSION, 0, 3) >= 1.9) && (substr($Settings::VERSION, 4) >= 1)){
$actor = $Globals::playersList->getByID($args->{pubID});
} else {
$actor = $Globals::players{$args->{pubID}};
}
$sanswer = 0 if (distance($char->{pos_to},$actor->{pos_to}) > $config{$prefix.$i."_distance"});
}
}
}
elsif (($packet eq 'packet_selfChat') && $config{$prefix.$i."_onSystem"}) {
debug " System Channel Detected.\n", "likeHuman";
if ($likeMsg =~/:/) {
($likeMsgUsr, $likeMsg) = $likeMsg =~ /(.*?).:.(.*)/;
}
else {
$likeMsgUsr="Server";
}
$sanswer=likeCheckMsg($likeMsgUsr,$likeMsg,$i);
$type = "c";
}
elsif (($packet eq 'packet_guildMsg') && $config{$prefix.$i."_onGuild"}) {
debug " Guild Channel Detected.\n", "likeHuman";
$sanswer=likeCheckMsg($likeMsgUsr,$likeMsg,$i);
$type = "g";
}
elsif (($packet eq 'packet_partyMsg')&& $config{$prefix.$i."_onParty"}) {
debug " Party Channel Detected.\n", "likeHuman";
$sanswer=likeCheckMsg($likeMsgUsr,$likeMsg,$i);
$type = "p";
}
elsif (($packet eq 'packet_privMsg')&& $config{$prefix.$i."_onPM"}) {
debug " Private Channel Detected.\n", "likeHuman";
$sanswer=likeCheckMsg($likeMsgUsr,$likeMsg,$i);
$type = "pm";
}
next if (!$sanswer);
# exit if the config option is not enabled
next if (!$type);
# exit if we don't have any reply
next if (!$answer);
## COPIED FROM processChatResponse, ChatQueue.pm
# Calculate a small delay (to simulate typing)
# The average typing speed is 65 words per minute.
# The average length of a word used by RO players is 4.25 characters (yes I measured it).
# So the average user types 65 * 4.25 = 276.25 charcters per minute, or
# 276.25 / 60 = 4.6042 characters per second
# We also add a random delay of 0.5-1.5 seconds.
my @words = split /\s+/, $answer;
my $average;
foreach my $word (@words) {
$average += length($word);
}
$average /= (scalar @words);
my $typeSpeed = 65 * $average / 60;
my $likeArgs;
$likeArgs->{timeout} = (0.5 + rand(1)) + (length($answer) / $typeSpeed);
debug " Timeout will be '$likeArgs->{timeout}'.\n", "likeHuman";
$likeArgs->{time} = time;
$likeArgs->{stage} = "start";
$likeArgs->{reply} = $answer;
$likeArgs->{prefix} = $prefix.$i;
$likeArgs->{type} = $type;
$likeArgs->{privMsgUser}= $likeMsgUsr;
if ((AI::action ne 'likeHuman') && (main::checkSelfCondition($prefix))) {
AI::queue("likeHuman", $likeArgs);
debug " Putting response in Queue.\n", "likeHuman";
message "likeHuman Block '$i' - Responding '$likeArgs->{reply}' to '$likeArgs->{privMsgUser}' in '$likeArgs->{timeout}' seconds.\n", "likeHuman" if ($config{'likeHumanConsole'});
}
$sanswer = 0;
}
}
sub AI_post {
if (AI::action eq 'likeHuman') {
my $args = AI::args;
if ($args->{stage} eq 'end') {
AI::dequeue;
debug " Removing response from Queue.\n", "likeHuman";
} elsif ($args->{stage} eq 'start') {
$args->{stage} = 'message' if (main::timeOut($args->{time}, $args->{timeout}));
debug " Executing response in Queue.\n", "likeHuman";
} elsif ($args->{stage} eq 'message') {
debug " Sending response.\n", "likeHuman";
my $net2;
if ((substr($Settings::VERSION, 0, 3) >= 1.9) && (substr($Settings::VERSION, 4) >= 0)){
$net2 = $Globals::net;
} else {
$net2 = \$Globals::remote_socket;
}
if ($args->{type} ne 'pm'){
sendMessage($messageSender, $args->{type}, $args->{reply}, undef);
}
else {
sendMessage($messageSender, $args->{type}, $args->{reply}, $args->{privMsgUser});
}
$args->{stage} = 'end';
}
}
}
sub match
{
my ($pattern,$subject) = @_;
if (my ($re, $ci) = $pattern =~ /^\/(.+?)\/(i?)$/)
{
if (($ci && $subject =~ /$re/i) || (!$ci && $subject =~ /$re/))
{
return 1;
}
}
elsif ($subject eq $pattern)
{
return 1;
}
return 0;
}
sub likeCheckMsg
{
my ($likeMsgUsr,$likeMsg,$i) = @_;
my $ssanswer=$sanswer;
debug " Messages previously received by '$likeMsgUsr' are $chatcount{$likeMsgUsr . '_' .$i}.\n", "likeHuman";
debug "Usr:$likeMsgUsr Msg:$likeMsg\n", "likehuman";
if ($config{$prefix . $i . "_chatCount"}) {
for (my $ii = 0; $ii < @questions; $ii++) {
next unless defined $questions[$ii];
if (match($questions[$ii],$likeMsg)){
debug " Match Found ['$questions[$ii]'] vs. ['$likeMsg'] - Responding '$answer'.\n", "likeHuman";
$chatcount{$likeMsgUsr . "_" .$i}++;
$ssanswer = 1;
};
}
if (!(Utils::inRange($chatcount{$likeMsgUsr . "_" .$i}, $config{$prefix . $i . "_chatCount"})) && ($ssanswer == 1)) {
if ($config{$prefix .$i. "_endings"}) {
$answer = $endings[rand(@endings)];
$chatended{$likeMsgUsr} = 1;
if ($config{'likeHumanRealIgnoreOn'} == 1) {
Commands::cmdIgnore "ignore","1 $likeMsgUsr";
}
} else {
$ssanswer = 0;
}
debug " ChatCount not in Range [$chatcount{$likeMsgUsr . '_' .$i} : $config{$prefix . $i . '_chatCount'}] - Ending Chat.\nResponding '$answer'.\n", "likeHuman";
message "likeHuman Block '$i' - Not Responding to '$likeMsgUsr' Cause ChatCount = $chatcount{$likeMsgUsr . '_' .$i}.\n", "likeHuman" if ($config{'likeHumanConsole'});
}
}else {
for (my $ii = 0; $ii < @questions; $ii++) {
next unless defined $questions[$ii];
if (match($questions[$ii],$likeMsg)){
$ssanswer = 1;
debug " Match Found ['$questions[$ii]'] vs. ['$likeMsg'] - Responding '$answer'.\n", "likeHuman";
$chatcount{$likeMsgUsr . "_" .$i}++;
};
}
}
return $ssanswer;
}
return 1;
Добавлено: Пт фев 23, 2007 1:43 am
piroJOKE