Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Можно отдавать на сервер swfку, а получать с него псевдокод функции, например.
С псевдокодом это жестко. Достаточно, чтобы сервер получал swf и генерил коючи. Есть 100% безопасность - не слать на сервер userid. ) Вот думаю, может сделать. Выдам коды доступа, по которым будет разрешаться генерация ключей и не буду слать userid на сервер. Без него authkey бесполезен.
Вообще, выгода для меня в пользователях. Я разворачиваю довольно интересную систему, требующую напряженной работы. Очень здорово прокачиваются умения. Сейчас система наконец-то работает без падений и зависаний, но уже интересно, что будет при увеличении количества пользователей. Сейчас идет 0,07 запроса в секунду.
В принципе, наверно да, сделаю коды доступа к генератору ключей и уберу посылку userid. Баланс безопасноси восстановится. ) Можно было бы починить зомбота, но у меня рука не поднимается. ))
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
С псевдокодом это жестко. Достаточно, чтобы сервер получал swf и генерил коючи. Есть 100% безопасность - не слать на сервер userid. ) Вот думаю, может сделать. Выдам коды доступа, по которым будет разрешаться генерация ключей и не буду слать userid на сервер. Без него authkey бесполезен.
Вообще, выгода для меня в пользователях. Я разворачиваю довольно интересную систему, требующую напряженной работы. Очень здорово прокачиваются умения. Сейчас система наконец-то работает без падений и зависаний, но уже интересно, что будет при увеличении количества пользователей. Сейчас идет 0,07 запроса в секунду.
В принципе, наверно да, сделаю коды доступа к генератору ключей и уберу посылку userid. Баланс безопасноси восстановится. ) Можно было бы починить зомбота, но у меня рука не поднимается. ))
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от vhyrix
Сейчас идет 0,07 запроса в секунду.
Цитата:
Сообщение от vhyrix
С псевдокодом это жестко.
Так как функция - просто последовательность применения одной из 10 функций к аргументу, 5 раз, достаточно просто выслать 5 значений номеров функций, типа
0: s=s
1: s=s+s
2: s=substr(s,0,len(s)/2)
и т д до 9.
Ловим swf, высылаем 9, 7, 8, 6, 1.
На возражение "а если поменяют систему авторизации, клиент переписывать" я отвечу "так он и так crc-то считает, и crc тогда вероятно поменяют тоже"
Будет 0.001 запроса в секунду Заодно вот питоновый модуль будет вообще из 30 строчек, а сама sig-генерация - 10. Массив лямбда функций и цикл по пришедшим 5 значениям. И продавай места не хочу. Ключ авторизации на Вашем сервере отдельной константой в модуле. Защиту от перепродажи вероятнее сделать геолокацией IP, я пока ничо лучше не придумал.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Я не понимаю, чего Вы хотите достичь этим утверждением? Чтобы я отказался от идеи?
Ни в коем разе. Наоборот, приветствую всеми своими конечностями Ведь из любой реализованной (иногда даже просто высказанной) идеи можно чего-то и себе отхватить в пользование.
Цитата:
Сообщение от megabyte0
А насчёт "глупа" - Вы слышали, что глупца невозможно убедить в том, что он глуп? Я бы предпочёл другого рода критику, более точную.
Не хотел, и не помышлял даже, обидеть. Глупым показался /знаю, знаю, что в таких случаях нужно делать/ сам подход к реализации.
Цитата:
Сообщение от megabyte0
0. Визуализация дерева групп фейков - самая ресурсоёмкая на мой взгляд задача - оно кому-нибудь, кроме vintets надо? У меня 1 фейк под ботом.
Я бы не сказал, что очень ресурсоёмкое, больше геморройное. tabWidget с динамическим созданием tab'ов в соответствии с количеством прописанных акков в settings.ini. Далее функция, создающая в каждом tab'е одни и те же лэйбы, чекбоксы, буттоны и т.д. Еще один геморрой - парсинг всех данных из конфига и привязка их к элементам управления в каждом табе. Ну и напоследок... один самый немаловажный нюанс в этом: на каждый акк - отдельный поток.
Кому оно надо тоже вопрос
Цитата:
Сообщение от megabyte0
(на данный момент я услышал только, что интерфейс к боту не нужен, только к настройщику, может я слушаю не так или не всё... )
Не понимаю, что такое интерфейс именно к боту. Как только пошла авторизация в приложении - уже ничего с ботом не сделаешь (по крайней мере в нынешнем исполнении). Инишник в любом случае необходим, потому как с нуля при каждом новом запуске бота никто не будет настраивать все элементы управления. Фактически морда нужна только для настроек... ну и как место для лога, раз уж пошла малина с отвязкой от консоли. При этом в чем соль морды - основной код выполняется в отдельном потоке, а гуй доступен для изменений.
Последний раз редактировалось dark-dragon; 17.08.2014 в 10:41.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от dark-dragon
с динамическим созданием tab'ов в соответствии с количеством прописанных акков в settings.ini.
Цитата:
Сообщение от vintets
а теперь умножь её на сотню...
Цитата:
Сообщение от vintets
Я например использую много фейков. Они поделены по группам у каждой свой бот. Второстепенные фейки (большинство) запускаю пачками, редактирование редкое.
Для этой цели и хочется "дерево групп" конфигов.
user1 - Логин, пароль, куки, группа урожай,
user2 - логин, пароль, куки, группа вишня,
user3 - логин, пароль, куки, группа рыбаки
группа рыбаки - подгруппа урожай, сажать клевер/тыквахел/чеснок/лилии 8:4:4:4, собирать рыбаков, создавать сердечки, создавать мозги
и т д.
И вот созрела на вишнёвых фейках вишня, и думаешь ты - мало она приносит, я лучше рыбаков там поставлю. Берёшь так и 30 фейков в 1 дрэг-энд-дроп переносишь в treeview из одной ветки в другую. Без гемора особо И радуешься.
И каждую группу при этом можно настроить и каждый акк детально. Просто выбрав текущим.
Цитата:
Сообщение от dark-dragon
на каждый акк - отдельный поток.
Цитата:
Сообщение от dark-dragon
Глупым показался сам подход к реализации.
Так просветите ж меня, как правильно? И откуда вообще про потоки на отдельный акк в настройщике идея? Я бы почитал. Мне казалось сделать топорно callback-функциями на изменение.
Цитата:
Сообщение от dark-dragon
Как только пошла авторизация в приложении - уже ничего с ботом не сделаешь (по крайней мере в нынешнем исполнении).
Это мне пока что слегка мешает - хочется кнопку "пауза", чтобы не перезапускать заново, а зайти в зф, пару построек достроить например, и пусть дальше сажает/работает. Да и переключить функции - поваров на дровосеков, допустим, без перезапуска, тоже хочется.
Цитата:
Сообщение от dark-dragon
парсинг всех данных из конфига
import ConfigParser не решает?
Цитата:
Сообщение от dark-dragon
привязка их к элементам управления
Привязка - при создании элемента интерфейса, в той же функции, отдельным параметром. Поясните, почему это неправильно?
Цитата:
Сообщение от dark-dragon
в каждом табе
for tab in tabs:
У Вас всё как-то получается слишком сложно, Вы наверно не на питоне думаете? (шучу)
Цитата:
Сообщение от dark-dragon
Я бы не сказал, что очень ресурсоёмкое
Имелись в виду человеческие ресурсы, конечно
Цитата:
Сообщение от dark-dragon
раз уж пошла малина с отвязкой от консоли.
Да вообще 3 режима запуска - GUI, консоль и демон. Демон удобен тем, что можно компьютер отдать, а бот работать будет, и никто случайно окошко не закроет
Цитата:
Сообщение от dark-dragon
Далее функция, создающая в каждом tab'е одни и те же лэйбы, чекбоксы, буттоны и т.д.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
И откуда вообще про потоки на отдельный акк в настройщике идея? Я бы почитал. Мне казалось сделать топорно callback-функциями на изменение.
Брррр, ну вот не нужно меня и себя запутывать. Я же написал, что мы отказываемся от консоли напрочь, для этого у нас теперь в бот встроена морда-настройщик и одновременно стартер (кнопкой Старт/Пуск) основного кода бота. Для примера же есть внешний вид бота от vhyrix.
А поток для того, чтобы не замораживался интерфейс. И уж тем паче как без многопоточности при 2-х и более акков?
И потом, автором изначально (не помню с какой версии) это дело /поток/ прописано уже в app.py class Thread.
Цитата:
Сообщение от megabyte0
Это мне пока что слегка мешает - хочется кнопку "пауза", чтобы не перезапускать заново,
Я еле нашел инфу о стопоре потока (костылем, да и то если это QThread, правда не испытывал). А по поводу кнопки пауза вообще не знаю, что ответить.
Цитата:
Сообщение от megabyte0
а зайти в зф, пару построек достроить например, и пусть дальше сажает/работает.
Это что-то из разряда фантастики. Даже допустив возможность создания кнопки Пауза. Как только запустишь ЗФ в браузере мгновенно слетает сессия в боте, что означает вываливание еррора при продолжении.
Всё остальное мелочи жизни
Как я вижу всё это:
1. Конфиг-файл остаётся AS IS. Ну может претерпевает какие-либо изменения под стать переписыванию функций в том самом game_engine
2. Прописываеццо морда. Либо путем переписывания уже имеющегося файла app.py, либо подключением отдельным файлом.
3. При запуске main.ru грузиццо морда, парсится конфиг-файл, переменные-данные подключаются к элементам управления.
4. Правим конфигурацию (либо оставляем всё как есть). Жмакаем кноповку Пуск (с одновременным сохранением изменений конфига). И в textEdit наблюдаем лог.
Что хотелось бы узнать:
1. Как правильно передать данные с элементов управления в основной код. Хотя, по сути можно и не трогать код, пусть себе парсит конфиг повторно
2. Правильный стопор потока. Да и иногда небольшая пауза тоже не помешала бы. В консоли хорошо с этим делом. Может есть тут спецы в PyQt, поделились бы опытом.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от dark-dragon
2. Правильный стопор потока.
Внутрь Game.eventLoop
Код:
while self.paused:
time.sleep(1)
Цитата:
Сообщение от dark-dragon
app.py
А там мне не особо понравилось, как сделан Thread.run , например. Мне, чтобы его остановить, этот Thread.on_quit пришлось вытаскивать фик знает откуда
Код:
self.__gui_input.on_quit()
Там вообще расширяемость не предполагалась, как я понял А упор был сделан на функциональность
Цитата:
Сообщение от dark-dragon
1. Как правильно передать данные с элементов управления в основной код.
Я не знаю, как правильно, я знаю - как просто. Должны же быть on_change методы у элементов управления? Вот на них вешаются setterы свойств объекта и обратно. Чтобы не зациклилось, можно проверять, кто вызвал, или передавать какой-нить лишний параметр.
Цитата:
Сообщение от dark-dragon
Как только запустишь ЗФ в браузере мгновенно слетает сессия в боте, что означает вываливание еррора при продолжении.
Конечно. На место паузы при нажатой паузе можно сделать 2 кнопки - unpause и restart.
Цитата:
Сообщение от dark-dragon
1. Конфиг-файл ... претерпевает какие-либо изменения под стать переписыванию функций в том самом game_engine
Так с этого всё и началось. Графический интерфейс делается только из-за изменения структуры конфига и Game.create_all_actors / Game.handleEvent , а то, что потенциально будет несложно менять переменные в боте во время того, как бот бегает, и, как следствие, получить интерактивность - просто вкусности подхода, не больше.
В итоге мы получаем хороший красивый кросс-совместимый бот (при условии, что экторы валидно написаны), то есть модуль от одного бота будет работать и на другом и наоборот.
Ещё можно модуль ожидания сделать (вернее, поменять ChangeLocation), который вешается на все события, где есть jobFinishTime или jobEndTime и прописывать, что на тот-то остров надо идти тогда-то. Когда нечего делать, бот тупо спит или копает соседей.
Цитата:
Сообщение от dark-dragon
2. Прописываеццо морда.
Я предлагал просто набор методов простого создания морды (по 1 методу на элемент управления, а не по 5-10 со всеми привязками) и пример морды этими методами. Кто хочет, сам сделает как ему/ей красивее/удобнее.
Цитата:
Сообщение от dark-dragon
Жмакаем кноповку Пуск
... перепривязываем переменные из редактора конфига в экторы бота... Интересно, как это обойти правильно?
Я же не говорил, что смогу и то и то сразу. Я говорил, что мне будет без разницы, привязаны переменные из экторов или из редактора конфига, по сути
P.S.
Цитата:
Сообщение от zloy_gnom_2012
схема проста как валенок___))
Что я делаю не так? Где "удвоить"? )
Последний раз редактировалось megabyte0; 17.08.2014 в 22:40.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
я уже писал как я сделал относительные пути в sig.swf run.cmd
да, знаю, мой копатель сложноват и не совершенен далеко. всё никак не займусь оптимизацией/совершенствованием. если у кого есть идеи или свои наработки буду рад взглянуть и помочь в разработке чем с могу. а так считаю что бота переработать хорошо. пишите в личку, а лучше [vk]39245930
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
Смотрите, что не пофиксил, пробуйте. Надо будет ещё обработку ошибок допилить и дублирование кода убрать в NamedFileStream extends FileStream, чтобы обходиться одной строчкой кода
NamedFileStream("sig.txt").writeUTFBytes("{"+outpu t.join(",\n")+"}"); вместо 5. почти доделанный, но рабочий .as
Забэкапьте старый на всякий.
Main.as
Код:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.filesystem.*;
import class_314;
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var file:File = new File(File.applicationDirectory.nativePath+"/url.txt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.READ);
this.serverUrl = stream.readUTFBytes(file.size);
stream.close();
//this.serverUrl = "http://java.shadowlands.ru/zombievk";
file = new File(File.applicationDirectory.nativePath+"/keys.txt");
stream = new FileStream();
stream.open(file, FileMode.READ);
var contents:Array = stream.readUTFBytes(file.size).split(" ");
stream.close();
//this.serverUrl = contents[0];
this.authKey = contents[0];
this.var_290 = new Number(contents[1]);
this.sessionKey = contents[2];
getSalt();
}
private var serverUrl:String;
private var sessionKey:String;
public var sigSaltFunc:Function;
private var var_290:Number;
private var authKey:String;
private var postfix:String;
private function getSalt():void
{
var loadSaltComplete:Function = null;
var loadSaltFileComplete:Function = null;
var loadSaltFileFailed:Function = null;
loadSaltComplete = function(param1:class_314):void
{
sigSaltFunc = param1.saltFunc;
var file:File = new File(File.applicationDirectory.nativePath+"/salt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
stream.writeBytes(param1.bytes);
stream.close();
timeGetOk();
};
loadSaltFileComplete = function(param1:class_314):void
{
if (param1.actualPostfix == postfix) {
sigSaltFunc = param1.saltFunc;
timeGetOk();
} else loadSaltFileFailed(param1);
};
this.postfix = sessionKey.substring(sessionKey.indexOf(":") + 1);
loadSaltFileFailed = function(param1:class_314):void
{
new class_314(serverUrl, postfix, loadSaltComplete);
};
new class_314(serverUrl, postfix, loadSaltFileComplete, loadSaltFileFailed, "salt");
};
private function timeGetOk():void
{
var file:File = new File(File.applicationDirectory.nativePath + "/sig.txt");
var stream:FileStream = new FileStream();
stream.open(file, FileMode.WRITE);
var output:Array = new Array();
var id:Number;
var sig:String;
for (var i:Number = 0; i < 1000; i++) {
id = var_290 + i;
sig = this.sessionKey + id.toString() + this.authKey;
sig = sig + this.sigSaltFunc(sig);
output[i]= new String("\""+id.toString()+"\":\""+sig+"\"")
}
stream.writeUTFBytes("{"+output.join(",\n")+"}");
stream.close();
stage.nativeWindow.close();
}
}
}
class_314.as
Код:
package
{
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.utils.getQualifiedClassName;
public class class_314 extends Loader
{
public function class_314(param1:String, param2:String, param3:Function, param4:Function = null, savedSaltSWF:String = null)
{
super();
if (savedSaltSWF != null)
this.url = param1 + "/salt?postfix=" + param2;
else this.url = savedSaltSWF;
this.postfix = param2;
this.completeHandler = param3;
this.failHandler = param4;
this.contentLoaderInfo.addEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
this.request = new URLRequest(param1);
load(this.request);
}
private static var var_1767:int = 3;
public var url:String;
public var completeHandler:Function;
private var failHandler:Function;
private var request:URLRequest;
private var var_1152:int = 0;
public var loaded:Boolean = false;
public var saltFunc:Function;
public var bytes:ByteArray;
public var actualPostfix:String;
private var postfix:String;
private function method_1684(param1:IOErrorEvent) : void
{
if(this.var_1152 < var_1767)
{
this.var_1152++;
this.request = new URLRequest(this.url);
load(this.request);
}
else
{
this.loaded = false;
this.contentLoaderInfo.removeEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
if(this.failHandler != null)
{
this.failHandler(this);
}
}
}
private function method_533(param1:Event) : void
{
var _loc2_:Object = param1.target.content;
this.bytes = param1.target.bytes;
this.actualPostfix = getQualifiedClassName(_loc2_).substr( -postfix.length, postfix.length);
trace(this.actualPostfix);
this.saltFunc = _loc2_.saltFunc;
this.loaded = true;
this.contentLoaderInfo.removeEventListener(Event.COMPLETE,this.method_533);
this.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,this.method_1684);
this.completeHandler(this);
}
}
}
Спасибо [отсортировано по времени]:
polkowoy за детальные вопросы по установке патча,
mike4kz за разработку альтернативной версии патча с разбором swf на питоне,
vintets за решение проблемы с русской кодировкой в пути,
dark-dragon за работающий фикс с относительными путями и постановку проблемы "белого окошка",
vintets, dark-dragon, zloy_gnom_2012 и причастным - за пояснения непонимающим,
vhyrix, JohnMorgan, dark-dragon и остальным участвовавшим - за поддержку и приятную атмосферу форума.
И, конечно, разработчикам и доработчикам оригинального бота и создателям зф, без которых это было бы невозможно.
в целом нет смысла в переходе на относительные пути, готовый swf все равно не работает если папки отличаються... ему видетели обяательно нужны сырцы для работы...
Хотя конечно как облегчение для компиляции swf лучше.
Относительные пути в конфигах: [Ссылки могут видеть только зарегистрированные пользователи. ]
Сейчас как раз пытаюсь решить данную проблему. но решения пока нет.
пробовал в батнике подмапить папку через subst x: "%CD%"
папка мапиться но run.bat выдает...
Error: Error #3003: File or directory does not exist.
at flash.filesystem::FileStream/open()
at Main/init()[X:\src\Main.as:22]
at Main()[X:\src\Main.as:13]
Хотя файл то там есть, хз чего, специфика работы subst...?
если кто осилит сделать решение под сервер готов положить на своем хостинге. да и в целом не проблема в батнике/питоне определить живой хост на котором лежит swf и далее дергать ее.
Последний раз редактировалось NBKua; 21.08.2014 в 00:22.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
NBKua, можно попробовать "file:///X:итд" или как там это пишется?
Сорцы - ну сделать release build вместо debug.
Сорри, если я очевидные вещи говорю и проблема не в этом.
Цитата:
Сообщение от NBKua
готовый swf все равно не работает если папки отличаются
Правда чтоли? А у меня ок всё, я пользую таки backup-версию из папки sig , переименованной в папку sig.bak и всё замечательно.
Последний раз редактировалось megabyte0; 21.08.2014 в 01:52.
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Цитата:
Сообщение от megabyte0
NBKua, можно попробовать "file:///X:итд" или как там это пишется?
Сорцы - ну сделать release build вместо debug.
Сорри, если я очевидные вещи говорю и проблема не в этом.
Правда чтоли? А у меня ок всё, я пользую таки backup-версию из папки sig , переименованной в папку sig.bak и всё замечательно.
Для меня ничего очевидного... впервые с flashdevelop столкнулся. посему что и как делать разбираю походу.
Пока что и релиз не помог не доганяю как потом с готовым swf работать
если дан только swf и url.txt для работы этого должно быть достаточно (java & airsdk стоят)