- Как мы gm-donate.ru открывали
- _AMD_
- _AMD_
- Зарождение идеи
- Неудачная попытка автоматизации
- Первый шаг в нужном направлении
- Начало работы
- Кстати, о прибыли
- Автодонат — говно
- Я зря работал?
- Я теперь не один
- Проблемы работы в команде
- Окей, поехали!
- «Че ты мне тут втираешь?»
- Эпилог
- Subscribe to Блог _AMD_
- Как настроить gm donate gmod
Как мы gm-donate.ru открывали
_AMD_
Основатель trigon.im и gm-donate.ru. Интересуюсь айти, текстами, продажами. Меломан, интроверт, альтруист
_AMD_
gm-donate.ru — система автоматического приема и обработки донатов (пожертвований) для Garry’s Mod серверов. Простыми словами – автодонат для гмод серверов.
GMD — это вторая попытка сделать качественный сервис для автоматизации донатов и мне кажется, она удалась.
Зарождение идеи
Идея автоматизировать прием донатов и выдачу услуг пришла после общения с очередным человеком, которому пришлось пол часа объяснять, что его не обманут и как пользоваться услугой. Я человек нервный, подобные разговоры нередко выводили меня из себя, а когда я прикидывал, сколько времени на них потратил и сколько еще потрачу, то решил процесс автоматизировать
Неудачная попытка автоматизации
Когда-то я даже пытался делать что-то вроде купонов для пополнения счета и продавать их через plati.ru, но вскоре понял, что я идиот. Это не только увеличило количество вопросов, но и забрало еще больше времени на создание этих кодов и их обработку
Первый шаг в нужном направлении
Пока игроки каждые пол часа наяривали мне в личку, я занимался поиском платежного агрегатора.
Это такой сервис, который предоставляет удобный интерфейс для работы сразу с множеством платежных систем за процент от транзакций.
Убив не один день на поиски, пришел к выводу, что без персонального аттестата WebMoney согласны работать только какие-то бомжегрегаторы.
Кстати говоря, получал я его достаточно долго. Там возникали какие-то проблемы с документами, оплатой, а также поездками для встречи с самим аттестатором, чтобы выслушать устрашающие (правда устрашающие) морали об ответственности. Кататься пришлось не один раз, но не помню почему.
1 апреля 2016, пока другие смеялись над белыми спинами, я наблюдал надпись «Одобрено» в панели управления unitpay.ru — агрегаторе, с которым я решил работать. upd. позже мы заключили договора сразу с несколькими другими агрегаторами, чтобы выбрать у каждого лучшие из условий
Начало работы
Пошла жара. Все идеи, которые я месяцами вынашивал в своей голове или записывал на задних страницах своих тетрадей начали превращаться в строки говнокода.
Тогда я был слишком глуп, чтобы осознать, что пишу код скрипта, который не поддается дальнейшей поддержке. Это был практически монолитный кусок говна, который я гордо называл «автодонат». Добавить в него новые услуги или информацию без моего мозга было нереально, но зато это работало и приносило реальную прибыль.
Кстати, о прибыли
Спустя пару месяцев вместе с осознанием ущербности своего творения, я заметил, что донаты выросли в среднем в 2-3 раза, при этом я практически перестал общаться на эту тему с игроками, ведь все происходило на автомате. И почему я раньше так не сделал? Был бы на пару сотен тыщ богаче.
Автодонат — говно
Код первого автодоната был настолько «крут», что когда очередной раз потребовалось добавление новой категории услуг, то я решил, что мне проще будет написать новый продукт, чем тыкать палкой этот.
Кстати, вот некоторые моменты с разработки его интерфейса:
Отложив новые услуги на потом, я начал рожать идеи для второй версии. Они должны были решить туеву хучу ошибок первой, а также иметь плюшки для еще большего увеличения профитов.
Заняло это «всего-то лишь 2 месяца», из которых одна лишь неделя на продумывание технической части и плюшек, а остальное на интерфейс, который в день начала работ был переосмыслен и к окончанию стал совсем не похож на то, что я понавыдумывал ? В общем, со сроками я справился на «ура». Ненавижу UI.
Я уже не помню, сколько времени потратил на написание первоначального кода, но точно помню, как матерился, пока писал интерфейс. Все это помнят. Он, как и во время придумывания, занял 90% времени разработки.
И так неделя, вторая, третья, продукт становится пригодным к употреблению. Переношу конфиг, добавляю новые задуманные услуги, последние тесты, фанфары, обратный отсчет, релиз на мастер-сервер. Работает! Можно и выпить минералки.
Я зря работал?
Новый автодонат увеличил прибыль проекта, но с количеством игроков на сервере, которое тогда уже сильно упало, это практически не имело значения.
Во время второй версии я договорился с некоторыми знакомыми и они также пользовались моим первым автодонатом. За это я брал с них какой-то процент, который со всех тех проектов меня устраивал, а знакомых устраивал автоматизм и увеличенный доход.
Думать долго не пришлось — вторая версия автодоната начала затачиваться под широкую аудиторию.
Я теперь не один
К этому времени я неплохо разбирался в lua, но ужасно в веб разработке. Мне нужен был человек, который займется этим. Я начал работать с тем, кого за несколько лет до этого банил перманентным баном на совсем чужом проекте, совсем не зная, кто это и уж точно не предполагая, что когда-то мы будем работать вместе :). Так GMD превратился в командный проект.
Проблемы работы в команде
Хочешь идти быстро — иди один. Хочешь идти далеко — идите вместе
Будущее проекта вставало под вопрос каждый раз, когда надо было что-то делать.
Сотрудничество началось с того, что мы с шаблоном сайта посрались (никто не хотел иметь дела с фронт-ендом), а потом срались «просто потому что должны» (с)
Так бывает, когда члены команды не знают кто и за что отвечает или когда нет начальника, но есть разногласия.
Конфликты, кстати, происходят до сих пор, но все же меньше, поскольку мы кое-как да распределили сферы своей деятельности. Хотя из-за них много амбициозных идей остаются лишь идеями — у напарника редко есть желание делать что-то новое, а у меня ругаться и платить фрилансерам или учиться самому. Замкнутый круг. Возможно, нам нужен тим лид?
Окей, поехали!
Все началось с того, что я перевел своих прошлых знакомых, которые использовали IGS #1 на IGS #2 (InGameShop. Так называлась часть автодоната (плагин), которую владельцы серверов должны были установить у себя на проектах)
Все шло хорошо, а что не хорошо, то быстро устранялось. Становилось ясно, что пора набирать клиентскую базу.
Сообщения некоторым знакомым, а также владельцам неизвестных серверов и у нас есть клиенты! Хорошие и плохие..
«Че ты мне тут втираешь?»
Я ненавижу общаться с владельцами гмод серверов (конечно же, не со всеми). Это просто толпа народа, каждый член которой живет на своем острове и не хочет принимать ничье мнение, кроме своего. «Я тут главный. Я лучше знаю, что мне нужно»
Навскидку 80% тех, кому я писал насчет автодоната сразу или не сразу грубо или деликатно, но посылали меня на@@й. Я уже писал об этом здесь, поэтому не буду повторяться.
Очень трудно (невозможно) найти общий язык с многими из них, а те, с кем удалось — исключение из исключений. Эти «исключения» готовы доверить нам свои деньги и платить за повышение личной прибыли и сокращение временных расходов на обслуживание донатеров, но пока на таких наткнешься, то на голове уже не останется волос.
В первое время это очень сильно разряжало и дизморалило. После попыток привлечения новых владельцев серверов просто не хватало энергии ни на что, кроме как на залип в потолок с меланхолией в наушниках. Затем я просто решил, что это естественный отбор и им не суждено заработать. Перестал им писать и моя жизнь наладилась.
Эпилог
Скоро наш автодонат будет праздновать свой первый День Рождения.
За этот год было проделано не мало работы и решено не мало конфликтов, включая личные. Мы успели сделать порядка 1800 выплат на общую сумму, превышающую несколько миллионов рублей и ни разу никто не обвинил нас в обмане или снижении прибыли.
Пока другие принимают платежи вручную, тратя свои силы и время на общения с донатерами, наши клиенты радуются повышенной доходности и полной автоматизации. Для этого был создан gm-donate.ru и с задачей он справляется лучше всех
Subscribe to Блог _AMD_
Get the latest posts delivered right to your inbox
Источник
Как настроить gm donate gmod
Итемы — основа этого скрипта. Каждый итем является отдельной донат услугой и имеет свой уникальный идентификатор (UID)
IGS(«Имя»,»unique_id») — добавляет услугу (итем) под названием «Имя» и с УНИКАЛЬНЫМ id «unique_id«. К этому итему применяются методы, которые описаны ниже
Метод | Описание |
---|---|
:SetDescription(«Блабла«) | Устанавливает текст, который будет виден при открытии подробной информации об услуге |
:SetPrice(19.95) | Устанавливает стоимось услуги в рублях |
:SetTerm(0) | Устанавливает срок действия услуги в днях. Если указать 0 — услуга единоразовая. Если не указать — бесконечная |
:SetCategory(«Категория«) | Устанавливает в какой категории будет отоброжатья услуга в главном меню. Если не указать услуга будет отображаться в категории «разное» |
Метод | Описание |
---|---|
:SetImage(«http://site/img.png«) | Устаналивает ссылку на «баннер» услуги. Рекомендуемый размер 1000х400 или в этом соотношении. Отобразиться в инфе о товаре |
:SetIcon(«http://site/img.png«) | Устанавливает Иконку в соотношении 1:1. Рекомендуемый размер 100 px |
:SetHighlightColor(col) | Устанавливает цвет текста названию услуги |
:SetStackable(true) | Разрешает покупку нескольких штук (например, накопительные услуги, типа лимита пропов). Использовать с SetTerm() |
= 0
Пример:
:SetCanBuy(function(pl, bGlobal)
if not pl:isPremium() then
return «Чтобы купить это нужен премиум!»
end
end)
Если условие возращает false выполняется :SetOnActivate
Пример:
При SetMaxPurchases(1) игрок сможет купить эту услугу только один раз.
Методы связанные с ULX
Метод | Описание |
---|---|
:SetULXGroup(group, weight) | Нужно указать, если итем является донат группой в ULX. |
В weight можно указать число. Если у игрока куплено несколько групп, то будет выдана группа с самым большим weight
Пример:
:SetULXCommandAccess(«ulx model»)
Методы связанные с FAdmin
Метод | Описание |
---|---|
:SetFAdminGroup(group, weight) | Нужно указать, если итем является донат группой в FAdmin. |
В weight можно указать число. Если у игрока куплено несколько групп, то будет выдана группа с самым большим weight
Методы связанные с Evolve
Метод | Описание |
---|---|
:SetEvolveRank(group) | Нужно указать, если итем является донат группой в Evolve. |
Методы связанные с DarkRP
Метод | Описание |
---|---|
:SetDarkRPItem(sEntClass) | Если указать класс шипмента или энтити, итем станет доступным только за донат |
:SetDarkRPTeam(iTeamID) | Если указать ID профы (пример: TEAM_MAYOR, TEAM_CP), профа станет доступна только тем, кто купил её за донат. |
:SetDarkRPMoney(iSum) | При активации игроку будет выдана указанная сумма денег. |
Методы связанные с PointShop 2
Метод | Описание |
---|---|
:SetPoints(iAmount) | Выдает обычные поинты |
:SetPremiumPoints(iAmount) | Выдает премиум поинты |
Методы связанные с Leveling System
Метод | Описание |
---|---|
:SetLevels(iAmount) | Добавляет указанное количество уровней |
:SetEXP(iAmount) | Выдает опыт |
Методы которые работают на всех гейммодах
Метод | Описание |
---|---|
:SetTool(sToolName) | Разрешает юзать определенный tool (rope, winch, advdupe2) только донатерам и админам |
:SetEntity(sEntClass) | Позволяет спавнить указанную энтити через спавн меню (Q) |
:SetWeapon(sWepClass) | То же, но для пушек |
:SetVehicle(sVehClass) | А это для машин |
Пример простой можно увидеть в базовом настройщике скрипта
От категории отличается тем, что в главном меню отображается, как единый элемент.
Сам группированый итем, как отдельный отображаться перестанет, чтобы не мозолить глаза чем особо полезна эта «штука».
IGS.NewGroup(«Имя группы») — Создает объект группы или возвращает существующую
Метод | Описание |
---|---|
:SetIcon(«http://site/img.png») | Устанавливает ссылку на иконку в соотношении 1:1. Будет отображена на главном фрейме на кнопке группы |
:AddItem(ITEM_OBJECT,»Имя в группе») | Добавляет предмет в группу под определённым именем. Если не указать имя в группе, то будет использовано стандартное название предмета. |
:SetHighlightColor(col) | Устанавливает цвет текста названию группы |
Хук | Аргументы | Описание |
---|---|---|
IGS.OnServersLoaded | Без аргументов | Вызывается после получения информации о серверах вашего проекта, где еще работает автодонат. Если хук не вызовется, скрипт не загрузится |
IGS.Initialized | Без аргументов | Вызывается после полной загрузки скрипта |
IGS.OnSuccessPurchase | player client table ITEM boolean isGlobal int itemID | Вызывается после успешной покупки предмета в магазине |
IGS.OnFailedPurchase | player client table ITEM boolean isGlobal string error | Вызывается после неудачной покупки предмета в магазине. Например, недостаточно денег или не прошла проверка :CanBuy |
IGS.PaymentStatusUpdated | player client table status | Вызывается после обновления статуса пополнения счета. На клиенте первый аргумент (игрок) не передается. |
pay — Деньги переведены.
error — Какая-то ошибка.
check — Игрок перешел к оплате
table purchases
После завершения вызывается этот хук.
На клиенте первый аргумент (игрок) не передается.
Хук | Аргументы | Описание |
---|---|---|
IGS.OnActivate | player client table ITEM | Вызывается после успешной активации итема с инвентаря. Можно использовать для выдачи дополнительных бонусов |
IGS.OnError. + method | string error table parameters | Для опытных. Вызывается в fetch.lua. Предназначен для перехвата ошибок с определенных методов. |
Пример перехвата:
hook.Add(«IGS.OnError.servers.get», «servers.get.catchError», function(error, parameters)
print(«Ошибка: » .. error .. «\n Переданные параметры: » .. parameters .. «\n»);
end)
table ITEM
boolean global
int invID
Пример:
hook.Add(«IGS.CanPlayerActivateItem», «OnlyAdminActivate», function(pl, item, global, invid)
if item:UID() == «admin_super_item» and !pl:IsAdmin() then
return false, «Активация возможна только для админов!»
end
end)
table ITEM
boolean global
int invID
Пример:
hook.Add(«IGS.CanPlayerBuyItem», «OnlyAdminBuy», function(pl, item, global, invid)
if item:UID() == «admin_super_item» and !pl:IsAdmin() then
return false, «Покупка возможна только для админов!»
end
end)
Хук | Аргументы | Описание |
---|---|---|
IGS.OnDepositWinOpen | int depositAmount | Вызывается при открытии окошка пополнения счета (Вот этого: https://img.qweqwe.ovh/1493842563826.png). depositAmount — сумма для пополнения на которую открылась менюшка |
IGS.OnItemInfoOpen | table ITEM | Вызывается при открытии этого окошка: https://img.qweqwe.ovh/1493843276142.png |
IGS.CatchActivities | panel activity panel sidebar | В хуке должен вызываться метод activity:AddTab(«Название вкладки»,Панель вкладки,»Путь к материалу иконки 32*32″) |
Если не хватает какого-то хука — скажите нам. Не добавляйте его сами
- В транзакциях покупки начинаются с «P: » (purchase)
- Активации купонов с «C: » (coupon)
- Пополнения счета с «A: » (add funds)
- Все операции с игроками проводятся по SteamID64 идентификатору (Никаких pl:SteamID())
- Избегай InitPostEntity и других хуков вроде loadCustomDarkRPItems при добавлении итемов в additems.lua, так как эти хуки могут проскочить из-за особенности загрузки скрипта.
Вся остальная информация находится в комментариях к методам и функциям в коде, но я постараюсь вскоре перенести сюда.
Источник