Giter Club home page Giter Club logo

larp-platform's Introduction

LARP-Platform Build Status

Here is a little manual:

  • Install JDK 1.8
  • Install Grails
  • Install PostgreSQL and create database for application
  • Run grails application.

How to install and configure JDK?

Download and extract Oracle Java SE Development Kit 8 or OpenJDK 8. Then add to ~/.profile file this line:

export JAVA_HOME=<path-to-jdk>
PATH=$PATH:$JAVA_HOME/bin

You can also install JDK via standart repositories:

sudo apt-get install openjdk-8-jdk

If JDK already installed in your system there may be some problems with default comands like java and javac. They can be linked with older version of Java. To know it exactly you should execute:

update-alternatives --config java

You will see a list of paths to different versions of JDK. Then choose a number of the correct version.

If there is no correct version, you can add it by the command:

update-alternatives --install /usr/bin/java java <path-to-jdk>/bin/java 1

Then try to configure symlink again and repeat this part for javac command.

How to install and configure Grails?

Download and extract Grails from official site. Then add to ~/.profile file this line:

export GRAILS_HOME=<path-to-grails>
PATH=$PATH:$GRAILS_HOME/bin

How to install PostgreSQL and create database?

Install PostgreSQL via standart repositories:

sudo apt-get install postgresql

If there is no russian locale in your system, you should install it:

sudo locale-get ru_RU.UTF-8

Then drop and create again cluster with russian locale:

sudo pg_dropcluster --stop <version> main
sudo pg_createcluster --locale ru_RU.UTF-8 <version> main

After this manipulations PostgreSQL daemon will be down. You should start it again:

sudo service postgresql start

In /etc/postgresql//main/pg_hba.conf add rules:

local sameuser all md5
local template1 all md5

And restart daemon.

Enter in PosgreSQL console like this:

sudo -upostgres psql

And create user and database:

#!sql
CREATE USER larp_platform ENCRYPTED PASSWORD 'larp_platform';
CREATE DATABASE larp_platform OWNER 'larp_platform';

To check connection try this:

psql -Ularp_platform

How to configure database settings?

Edit file grails-app/conf/DataSource.groovy:

#!groovy
dataSource {
    ...
    username = "larp_platform"
    password = "larp_platform"
}

...
environments {
    development {
        dataSource {
            ...
            url = "jdbc:postgresql://<host>:5432/larp_platform"
        }
    }
    ...
}

How to run application?

You can run application on internal tomcat (development mode by default):

grails [-Dgrails.server.port.http=8090] [dev|test|prod] run-app

Also you can deploy war-file on tomcat manualy. To build war-file execute (production mode by default):

grails [dev|test|prod] war

larp-platform's People

Contributors

sayonara-sama avatar serjantiquity avatar treble-snake avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

larp-platform's Issues

Изменить жизненный цикл заявки/анкеты

Добавить возможность вернуться к рассмотрению анкеты, или просто возможность ее отклонить после “Заявка принята, создается персонаж”.

Обдумать жизненный цикл еще получше, расширить возможности.

Добавить кнопку "Зарегистрироваться" в шапку

Кнопка "Зарегистрироваться" должна быть доступна неавторизованным пользователям и расположена рядом с кнопкой "Войти".

Сейчас эта кнопка есть на странице с формой входа - оттуда ее убирать не надо.

Настроить именование .war-файла в Travis

Необходимо настроить Тревис так, чтобы имя отправляемого на сервер архива дополнялось именем ветки, в которой происходит билд, то есть ROOT-{branch}.war.

Вероятно, можно использовать переменную $TRAVIS_BRANCH, но у меня не получилось сходу.

Реализовать реакцию периодических правил изменения ресурсов на нарушение ограничений

Т.к. теперь у ресурсов может быть минимальное и максимальное значение, то правила периодического изменения могут их нарушать.

Точнее, правило не сработает, если под угрозой будет наружение ограничения.

Однако, требуется придумать и реализовать механизм оповещения мастеров о таких событиях.

Модифицировать модуль ресурсов

Для типа ресурса

  • В модель и на форму создания/редактирования ресурса нужно добавить поле "Хранилище", где будет содержаться строка - название для экземпляров ресурса.
  • Переименовать поля:
    • Название - Название ресурса
    • Название идентификатора - ID Хранилища (подсказка: “Например: номер счета”)
    • Мин/Макс значение по умолчанию - мин/макс значение при создании
  • Поле ID хранилища обязательное, однако у него нет звездочки

Для экземпляра ресурса

На форме создания экземпляра:

  • Удалить поле Название
  • Источник —> Источник поступления (откуда можно получить ресурс)
  • Создание ресурса типа Суп —> Создание хранилища для ресурса “Суп”
  • Идентификатор —> *Название хранилища
  • Нет пробела в таблице в колонке ID

Убрать jQuery из зависимостей плагинов.

Сейчас некоторые плагины подтягивают свою версию jQuery.

Если посмотреть в dev режиме, то подключаются аж 3 штуки. Причем плагины подтягивают всякое старье. Это надо прекратить.

Разработать механизм остановки и возобновления игры

Некоторые игры делятся на сессии, между которыми игрового взаимодействия не происходит. Поэтому необходимо дать возможность мастер остановить и возобновить игру.

Если игра остановлена, то:

  • Игроки не должны иметь возможность предпринимать какие-либо действия на запись (только просмотр инфы)
  • Периодические правила начисления ресурсов должны останавливаться.

Обработка исключений и логгирование

Необходимо реализовать базовый тип исключений для приложения и использовать его в ситуациях, когда мы должны сообщить пользователю о его ошибке. Возможно, стоит также отдельно наслендика от RuntimeException, т.к. в транзакционных методах не Runtime-исключение приводит к откату транзакции и потере сообщения об ошибке.

См. TODO в BaseController::doAjax().

Исправить ошибки при регистрации нового пользователя

Данные для регистрации, вызывающие ошибку:

  • логин - admin
  • имя - admin
  • e-mail - [email protected]
  • пароль - пароль
  • повторите пароль - пароль

На локальном компе результат выглядит так:
img_05102015_223617

На сервере - так:
img_05102015_223709

Нужно это исправить и выводить нормальные сообщения об ошибках.

Добавить механизм мастерских новостей игры

У мастеров должна быть возможность размещать новости/объявления на главной странице игры.

Игры на главной будут сортироваться по дате последней новости.

Некоторые действия, например, запуск и остановка игры, автоматически добавляют объявление.

Протестировать GUI на больших объемах информации

Проверить, как будет вести себя каждая страница при наличии большого объема информации.

Т.е. и большого количества элементов, и большого объема содержимого полей.

При выявлении некорректной работы или отображения страниц - создать соотв. задачи.

Реализовать опцию "публичной/закрытой" игры

В публичную игру заходить и заполнять анкету может любой юзер.

Видеть публичную игру, заходить в нее на главной, отправлять заявку - могут все.

Закрытая игра доступна только по приглашениям мастеров.

Дать возможность Мастеру видеть игру от лица персонажа, за которого он зашел

Сейчас права ГМ-а имеют приоритет перед правами персонажа, и, зайдя за любого персонажа, ГМ увидит все записи, независимо от настроек и ролей персонажа.

Необходимо дать мастерам опцию типа "зайти как", чтобы видеть окружение, построенно непосрественно на правах персонажа, за которого заходит мастер.

Выводить пагинатор только в случае необходимости

Для страниц, где может понадобиться пагинатор, мы дожны в контроллере определять, нужно ли его отображать.

Для этого надо сравнить общее кол-во сущностей с максимальным допустимым на одной странице и передать булево значение во вьюху. Соотв, в ней отображать пагинатор только если нужно.

Реализовать модуль "База чипов"

Довольно простой модуль.

Чип - это запись в БД / наклейка на игровом предмете.

Свойства:

  • номер - не обязательно число, м.б. прозвольной строкой
  • описание - текстовое поле
  • владелец - персонаж данной игры, с которым связан чип.

Вся функциональность базы чипов доступна только мастерам. Базовый CRUD. Плюс фильтры по персонажу-владельцу.

Исключение при старте томката

Жить не мешает, но надо бы разобраться.

09-Sep-2015 20:32:11.407 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [200] milliseconds.
09-Sep-2015 20:32:11.713 SEVERE [localhost-startStop-1] org.apache.catalina.session.StandardManager.doLoad standardManager.loading.ioe
 java.io.InvalidClassException: ru.srms.larp.platform.sec.LarpGrailsUser; local class incompatible: stream classdesc serialVersionUID = -5638136030820430993, local class serialVersionUID = 5414141664119991284
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1634)
    at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1099)
    at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:261)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:180)
    at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:460)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

09-Sep-2015 20:32:11.715 SEVERE [localhost-startStop-1] org.apache.catalina.session.StandardManager.startInternal Exception loading sessions from persistent storage
 java.io.InvalidClassException: ru.srms.larp.platform.sec.LarpGrailsUser; local class incompatible: stream classdesc serialVersionUID = -5638136030820430993, local class serialVersionUID = 5414141664119991284
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
    at org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1634)
    at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1099)
    at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:261)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:180)
    at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:460)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5179)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:917)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1701)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

09-Sep-2015 20:32:12.415 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /opt/larp.platform/tomcat8/webapps/ROOT.war has finished in 134,865 ms

Выяснить, требуется ли добавлять в формы поле version.

Version используется в доменных объектах для оптимистических блокировок.

Есть ли смысл добавлять его в формы редактирования доменных объектов?

Grails почему-то по умолчанию добавляет. Надо разобраться, зачем и надо ли. Если нет - поудалять.

Изменить управление "Модулями" на странице конфигурации игры

Сейчас управление модулями реализовано обычным мульти-селектом.

Он не очень заметен, не очень нагляден и не даёт пояснения относительно модулей.

Необходимо выделить модули в отдельный блок, реализовать их выбор чекбоксами (скорее всего). Для каждого модуля дать описание.

Назначение взаимородительских ролей

Проблема
Допустим, есть роль "Вампир", у нее дочерняя роль "Вентру".
Если взять на редактирование роль "Вампир" и выбрать в кач-ве родительской роль "Вентру", то сервер подвиснет и роли исчезнут из списка.

Желаемый результат
Обдумать ситуацию. Либо корректно обрабатывать изменение родителя, либо убрать лишние пункты из селекта.

Написать или найти и настроить модуль/плагин управления веб-формами

Сейчас неудобно создавать и изменять веб-формы добавления/изменения модели.

Нужно или написать модуль с DSL для этого, или использовать существующий (например, https://grails-fields-plugin.github.io/grails-fields/guide/index.html).

Вероятно, связано с анкетой персонажа

Убрать ссылку из поля "Название" в настройках анкеты

Нужно убрать ссылку из поля "Название" в "Поля анкеты игрока" пр редактировании анкеты.
Сейчас при клике на название получаем ошибку:
"
Доступ запрещен!
Извините, но вам не разрешен доступ к этой странице.
"
Например http://city-rpg.srms.club/play/CamelotAge77/character-request-field/index под пользователем gm1.

Избавиться от плагина Spring Security UI

Сейчас он используется только для формы регистарции/авторизации/восстановления пароля, а подтягивает несколько зависимостей, увеличивает время старта приложения.

Т.е. вреда больше, чем пользы.

Необходимо убрать плагин из зависимостей и реализовать недостающую функциональность силами Платформы.

Переписать реализацию сравнения нового и старого значения свойств

Есть некоторые места, где новые (введенные) значения свойств моделей сравниваются с хранящимися в базе данных. Для этого используются всякие извращения.

Оказалось, есть нормальных метод: http://grails.github.io/grails-doc/2.4.4/guide/GORM.html#modificationChecking

Нужно найти все эти и места и переписать.

Разобраться с flush: true

Разобраться, так ли уж нужен во всех сервисах этот flush: true, генерируемый скаффолдингом. Если не нужен - поудалять.

Ignoring options при старте приложения

При старте приложения в логах видно следующее:

#!
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256m; support was removed in 8.0

Разобраться с трейтам, содержащими методы-геттеры для свойств доменных объектов

Если создать трейт с методами-геттерами с такими же названиями, как геттеры свойств доменного класса, а затем пронаследовать доменный класс от этого трейта, например так:

#!groovy

class SomeDomainClass implement WithIdAndTitle {
  String title
}

trait WithIdAndTitle {
  public abstract Long getId();
  public abstract String getTitle();
}

То IDEA начинает бесконечным потоком выдавать эксепшены до переполнения стека, когда пытается сохранить файл, который использует этот класс (возможно, есть доп. условия).

Надо бы разобраться.

Поменять лейбл “Ваши персонажи” при входе из-под мастера .

На странице игры, если зашедший игрок является мастером (имеет админские права на игру) - то изменить лейбл "Ваши персонажи" на "Все персонажи".
Мастерские права во вьюхах проверяются, например, в play.gsp при подключении наблона gmControls.

Реализовать модуль "Анкета игрока"

Модуль должен позволять мастерам устанавливать формат анкет, а игрокам - заполнять и отправлять их.

С мастерской стороны:

Анкета настраивается как для игры в целом, так и дополнительные поля для отдельных ролей.
Анкета - это набор полей с произвольными названиями.
Свойства поля:

  • порядок сортировки
  • название
  • обязательность
  • тип.

Типы полей:

  • однострочный текст,
  • многострочный текст,
  • чекбокс,
  • селектбокс (с мультиселектом).

Мастер может настроить, какие роли следует отображать в селекте.

Отправленные игроками анкеты отображаются в специальном мастерском разделе игры.

Workflow

У анкеты есть состояния.

  • Черновик. Игрок может редактировать, мастерам пока не видна.
  • Отправлена на рассмотрение - игрок отправил анкету. В этом статусе игрок может править анкету.
  • На рассмотрении - мастер принял анкету на рассмотрение. Игрок не может править анкету.
  • Требуется уточнение - мастер дал комментарий, и требуется реакция игрока. Игрок может править анкету.
  • Принята - мастер принял анкету, создает персонажа. Здесь и далее игрок не может править анкету.
  • Отклонена - анкета не принята (мастер должен дать комменатрий).
  • Персонаж создан - по результатам анкеты к ней прикреплен персонаж.

Со стороны игрока:

В блоке "Ваши персонажи" отображается кнопка "Отправить анкету" (если персонажей нет - большая кнопка).
Кнопка ведет на страницу с анкетой - там расположена форма с нужными полями, в зависимости от выбранной роли появляются дополнительные поля.
Игрок заполняет и отправляет анкету.
Ссылка на анкету и ее состояние отображается игроку в блоке (в некоторых состояниях он может править ее).

Добавить каптчу в формы

Вероятно, для этого есть плагин.

Каптчу надо добавить в формы:

  • регистрации;
  • восстановления пароля;
  • наверное, логина тоже.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.