mva
use gentoo, Luke! :D
Saphire
Сейчас вот как раз играю :3
Saphire
980k
Snusmumriken
Сосунки!
Вот игра для мужиков!
https://candybox2.github.io/
fgntfg
Прошел
Snusmumriken
Saphire
Как там дела со скрепками? :D
Saphire
550 децилионов :3
Saphire
770...
Saphire
У меня производство ограниченно с коростью исследования.
Saphire
Paperclips: 30,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
Snusmumriken
Обнаружил косяк у стима с luajit-ffi.
Там не работают колбеки, ибо используются классы и макросы, а ffi - только сишка : )
Snusmumriken
Карочи, у меня в стиме работает куча всего.
Кроме p2p, ибо подключение клиентов на колбеках,
колбеков на оверлей,
колбеков на ещё тонну всего :<
Колбеки-колбеки.
Самое противное, что похоже придётся катать враппер либы на c++.
Snusmumriken
Snusmumriken
На самом деле, можно бешено читерить, ибо в стиме есть такая прикольная штука как 'RichPresence'. Туда можно загонять по 20 произвольных комбинаций key-value, соответственно, Соответственно, вместо колбеков на сообщения можно отправлять сообщения прям туда, типа:
"setKeyValue(lobby_id, message)", а все кто в лобби типа мониторят друг друга несколько раз в секунду, не появилось ли чего у другого, и реагируют на это соответственно. Но это - бешеное извращение, относительно колбеков.
Snusmumriken
Кто-нить шарит в плюсах или возможности вызывать c++ макросы из ffi? : )
Snusmumriken
Суть вот тут:
https://partner.steamgames.com/doc/sdk/api#callbacks
Внутри steamworks:
https://github.com/pmrowla/hl2sdk-csgo/blob/49e950f3eb820d88825f75e40f56b3e64790920a/public/steam/steam_api.h#L318
Всё кроме колбеков я делаю.
Snusmumriken
Слишком сложно? :<
Я тоже так думаю, надо либу фигачить.
Snusmumriken
Ага.
Khasan
Не
Khasan
Подпишитесь
Khasan
Да
Snusmumriken
Чего пришёл?
Khasan
Я вроде настоящий
Khasan
Как
Snusmumriken
42 + триста
Khasan
342
Khasan
Ахах
Snusmumriken
Воу, ничоси
Snusmumriken
Роботы научились распознавать текст и автоматом преобразовывать его в цифры, и складывать )))
Khasan
Именно
Snusmumriken
Кстати да, надо моих ботов научить
Khasan
А у тебя есть боты?
Snusmumriken
Ну это слишком сложно, если научить ботов программировать - то зачем будут нужны люди?
Khasan
Я не хацкер
Khasan
Не шарю в этом
Snusmumriken
Ну в общем, народ тут не подписывающийся, пардон
Khasan
Я запрограммирован только для этого
Snusmumriken
Тут все кулхацкеры.
Khasan
Проголосуйте хотя бы
Khasan
Потом бантик
Khasan
Баньте
Snusmumriken
Слушай, а какая зп за рекламу?
Khasan
Всм
Snusmumriken
Ну, ты же не просто так бегаешь, у тебя явно какой-то профит.
Мне было бы лень прост. Я бы бота написал.
Snusmumriken
Точнее, уже написал )))
Khasan
А разве есть боты для этого.?
Snusmumriken
Боты есть для всего подряд.
Например для этого: https://habrahabr.ru/company/croc/blog/335650/
Snusmumriken
Вот такая вот реклама в тысячах мест в секунду - это вообще норма, истинное предназначение ботов Какими бы благими целями люди бы не прикрывались - реально они пишут ботов для мегарассовых рассылок.
Saphire
Snusmumriken
Пирата?
Это специальная игра для разработчиков в стиме, appid 480.
Рядом болтаются сурцы с описанием "Как пользоваться стимом для чайников"
Snusmumriken
На самом деле, можно и любую другую игру заюзать для этих целей, только твоя прога будет падать на колбеке приглашения в катку от сотни тысяч друганов, с другим форматом запроса.
Ну прикинь, заюзал ты appid от другой игры, прописал колбеки: "Если приглашают - подключаться". А к чему подключаться, если 100500 друзей ломятся срочно с тобой загамать, когда ты только тестишь либу, и она несовместима с форматами игр в которые тебя приглашают?
Карочи, меня начинает заносить, приятных снов.
#ботживи (на самом деле нет :( )
Snusmumriken
Карочи, придётся писать dll-лину для lua. Зато она будет совместима с любыми играми, в которых есть луа )))
К счастью, стим существует под не очень большое количество платформ, а такая обёртка - не задействует ничего платформенного, это прям круто-круто.
Но всё таки не очень, потому что через luajit я могу вообще не париться на тему архитектур библиотек и всего такого.
Alexey
Я работаю над реализацией mimi API в Lua-cURL.
libcurl предоставляет API
curl_mimpart_data() - установить данные
curl_mimpart_type() - установить Content-Type
curl_mimpart_name() - установить параметр name в заголовке Content-Disposition
При этом если передать NULL в качестве параметра то значение будет сброшено.
Я реалзовал метод в Lua как
part:data(str[,type[,name]]). Т.е. можно вызывать как
part:data('string') - только данные
part:data('string', 'text/plain') - данные и тип
part:data('string', 'text/plain', 'myname') - данные, тип и имя.
А так же part:name() и part:type()
Теперь вопрос как организовать сброс параметров
--- Случай 1
part:data('string1', 'text/plain', 'myname')
part:data('string1')
part:data('string1', nil, nil)
part:data('string1',nil, 'another')
--- Случай 1
part:name( 'myname')
part:type( 'text/plain')
part:data('string1')
Я думаю использовать false для того чтобы сбросить значение
mva
ну, да, false как-то более явно (да и иначе не получатся фокусы (с использованием вариаций вызова) озвученные выше)
Snusmumriken
Используй пустое значение.
function part:type(v)
-- nil в конце чтобы не было false
-- от результата логического выражения
self._mime = type(v) == 'string' and v or nil
end
И вот такой вызов:
part:data('string1',nil, 'another')
не должен ломать mime-type, то есть:
function part:data(data, mime, name)
return self:_request(
data or self._data,
mime or self._mime,
name or self._name
)
end
Ну, если не указано - выставлять то что было указано ранее, как дефолт, или ещё что-то такое.
Объекты вам дадены чтобы вы как раз могли хранить в них состояния, и стоит это использовать.
Alexey
Там есть еще случаи
Я думаю что для сброса значения буду использовать false.
Но это не очень Lua-way мне кажется. Сброс по nil более естественный.
param:type() -- вполне естественно сбросить type
param:type(nil) -- тоже очевидно что пользователь хочет присаоить nil
Но если есть код
param:type(mimetypes.guesstype('test.xml'))
Тут уже не очевидно. Если тип определен - то установить его.
Но если нет то можно оставть текущий (не менять) или сбросить
значение в default.
В этом случае мне нравится по nil не менять значение, а оставить
прежнее. А если надо сбросить, то можно написать
param:type(mimetypes.guesstype('test.xml') or false)
Так же если param:type(nil) сбрасывает тип, то вполне очевидно
что param:data(nil) долже сбросить данные, так же как и
param:data(nil, nil, nil). Но последний вариант получается не
сбрасывает тип и имя. Что тоже не очень очевидно, но вполне
можно сказать, что для сброса конкретного элемента нужно
использовать специальную функцию.
Еще можно добавить специальные методы для сброса.
Но их нет в оригинальном API и я не очень хочу их добавлять.
Поэтому я думаю false для сброса вполне подходящая альтернатива
-- установить данные не менять тип и сбросить имя
part:data('hello', nil, false)
Т.е. установка nil не меняет текущего значения.
Единственное part:type() так же не будет сбрасывть значение,
т.к. я не люблю разную семантику для type() и type(nil)
PS. А в реальности не думаю что эта часть API будет часто использоваться
Более вероятно что MIMI объекты будут просто создаватся заново когда это
будет нужно, а не использоваться повторно
PPS. Еще я размышляю над API для curl_mimepart_data_cb и над форматом
тадлицы для постороения MIME объекта
Snusmumriken
> param:data(nil, nil, nil). Но последний вариант получается не
сбрасывает тип и имя. Что тоже не очень очевидно, но вполне
можно сказать, что для сброса конкретного элемента нужно
использовать специальную функцию.
Различай nil и false.
function part:data(data, mime, name)
local tdata, tmime, tname = type(data), type(mime), type(name)
self._data = data == false and nil or tdata == 'string' and data or self._data
self._mime = mime == false and nil or tmime == 'string' and mime or self._mime
self._name = name == false and nil or tname == 'string' and name or self._name
return self:_request(
self._data,
self._mime,
self._name
)
end
param:data(nil, nil, nil) - ничего не сбросит
param:data() - тоже ничего не сбросит
param:data(nil, 'xml', nil) - заменит mime на xml
param:data(false, 'xml') - заменит mime на xml, удалит data
Snusmumriken
Если человек выставил false - ты видишь явное намеренье удалить.
Если человек ничего не выставил в функции с множеством аргументов - твоя задача помочь с выставлением дефолтных значений.
Если человек ничего не выставил в заполняющей функции с одним аргументом - он, вероятно, хочет уничтожить значение.
Anonymous
давай попробую
Anonymous
http://i.imgur.com/MdTs8vI.png
mva
GDE OLEG
Snusmumriken
Ничоси. С++-либы компилятся и цепляются!
Snusmumriken
Я скомпилил вот такую ерунду через g++!
Snusmumriken
Скоро ко мне можно будет обращаться за плюсовыми либами (не очень сложными)
Оно даже экспортится в табличку!
power = require'power'
Elias
Это компилится в .dll, да?
И потом можно использовать независимо как обычный модуль?
Snusmumriken
Ага.
Snusmumriken
Я просто хочу запилить взаимодействие с колбеками steamapi в dll-ку.
Просто так не получится, ибо колбеки там как c++-шаблоно-классо-макросы.
Elias
Круто
Просто я всегда Lua из C++ напрямую запускал, и даже не думал, что Lua может запускать другой C++ код, не основной программы. :D
Elias
И возможно стоит самому делать такие модули, будет чуть лучше, наверное, чем просто регистрировать всё глобально в lua_State*
luacheck ругается на глобальные переменные, и наверное не зря. :)
Snusmumriken
Ну, эта фигня не делает глобальных, а пушит табличку типа.
Elias
Ага, вот это и хорошо
А то я хотел избавиться от всех глобальных переменных, и только C++ функции оставались таковыми
Snusmumriken
Тут даже этого нет, так что..
Elias
Ага
Просто я что-то только недавно задумался о том, что вообще нехорошо создавать столько глобальных вещей (переменных не делал, только классы и функции)
Но теперь перешёл полностью на модули и всё гораздо лучше стало в базе. Явно прослеживаются зависимости, красота
Мало того, Sublime может находить определения локальных функциях внутри загружаемых модулей, ещё один плюс.
Elias
Да, просто это от C++ пошло, мол классы - глобальные (почти)
Да и видел в разных играх, что так делали, например в Don't Starve. Но всё же успел прочувствовать минусы этого подхода
Elias
Ну, в смысле если хедер включить куда-то, то сам класс будет в глобальной области видимости (если он не в namespace)
Я об этом
Elias
Но пока что не решаюсь делать
local SomeClass = require 'SomeClass' внутри функций или даже if/else
Как-то нагляднее всё require'ить в самом начале модуля
Да, только хэдер может включать другие хэдеры, и в итоге можно получить от него сразу много классов и свободных функций.
Скорее Lua тут выигрывает в плане модулей, что можно классы и функции делать локальными в модуле и не получать "бонусов" при включении этого модуля в другие.
Elias
И ещё открыл для себя плагин Sublime, который постоянно проверяет редактируемый файл в luacheck и качество моей жизни возросло в разы. (Что-то там вроде Sublime Lua Linter)
Yuriy