1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Плагин [chat/web]MSC_SiteChat

Тема в разделе "Неподтвержденные плагины", создана пользователем danilko, 16 фев 2015.

  1. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    MSC_SiteChat - чат сервера на сайте:
    Версия: v0.1
    Плагин для демонстрации работы API(моста). Возможности самые минимальные, защиты почти нет. Использовать "на продакшене" можно, но не стоит.
    Особенности:
    • Может выводить последние сообщения с сервера на сайте
    • Можно отправлять сообщения с сайта на сервер
    • Использует мост MSC_bridge
    Скачать тестовый плагин
    Подумал не стоит создавать отдельный репозиторий на github для одного файла. (ну ладно, трех ещё ж бинарник и plugin.yml)
    В общем src:
    Код:
    package danilko09.msc_sitechat;
    import danilko09.msc_bridge.MSC_bridge;
    import danilko09.msc_bridge.event_handler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.bukkit.Bukkit;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerChatEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    public class MSC_SiteChat extends JavaPlugin implements Listener,event_handler{
      private Logger log;
      private String[] str = new String[64];
      private int lst = 0;
    
      public void onEnable(){
      log = this.getLogger();
      log.info("MSC_SiteChat has been enabled!");
      ((MSC_bridge) Bukkit.getPluginManager().getPlugin("MSC_bridge")).addHandler("chat", this);
      getServer().getPluginManager().registerEvents(this, this);
    }
    public void onDisable(){
      log.info("MSC_SiteChat has been disabled.");
    }
    
      @EventHandler public void onChat(PlayerChatEvent event) {
    
      new Thread(){
      public void run(){
      try { ((MSC_bridge) Bukkit.getPluginManager().getPlugin("MSC_bridge")).callSite("chat",""); }
      catch (Exception ex) { Logger.getLogger(MSC_SiteChat.class.getName()).log(Level.SEVERE, null, ex); }
      }
      }.start();
      String msg = "["+event.getPlayer().getDisplayName()+"]"+event.getMessage();
      addToLog(msg);
      }
    
      private void addToLog(String msg){
      if(lst < str.length){
      str[lst] = msg;
      lst++;
      }else{
      int i;
      for(i = 1; i<str.length;i++){
      str[i-1] = str[i];
      }
      str[i] = msg;
      }
      }
      @Override
      public String onRequest(String uri) {
      if(!"".equals(uri) && uri != null){
      try {
      uri = uri.substring(1, uri.length());
      String res = ((MSC_bridge) Bukkit.getPluginManager().getPlugin("MSC_bridge")).callSite("chat",uri);
      if(!"".equals(res) && res != null){
      String msg = "[site]"+"["+uri+"]"+res;
      Bukkit.broadcastMessage(msg);
      addToLog(msg);
      }
      } catch (Exception ex) {
      Logger.getLogger(MSC_SiteChat.class.getName()).log(Level.SEVERE, null, ex);
      }
      }
      String ret = "";
      for(int i = 0; i<str.length;i++){
      if(str[i] == null){break;}
      ret = ret + str[i]+"\n";
      }
      return ret;
      }
    
    }
    
    Говнокодно... Позже причешу, чтоб глаза не резало.
    Как работает:
    [​IMG]
    (как получить такое: http://rubukkit.org/threads/chat-web-msc_sitechat.98495/#post-1535792)

    Лог изменений:
    Версия 0.1
    • Релиз плагина
     
    Последнее редактирование: 23 апр 2018
  2. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Воу-воу-воу... Что с табуляцией? И комментарии-бы не помешали
    И обычно делают наоборот.
    res.equals("")
     
  3. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    М-м. А если res null? NPE
     
  4. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    анал тут при чём?
     
  5. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    null.equals("") норма?
     
  6. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    С табуляцией всё было ок до "CTRL+C CTRL+V". Комментарии будут, как до причесывания дойду, это завтра, наверно.(Сейчас пока не могу, занят)
    [​IMG]

    Без разницы же. NetBeans предложил поменять, я согласился.
     
  7. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    Потому что я писал выше, вот почему. (с)
     
  8. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    К тебе уже Малышева бежит
     
  9. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    akhq6o.jpg.jpg
     
  10. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Он всегда предлагает поменять.
    [​IMG]
    NullPointerException жш, если вне контекста API смотреть. А так, у меня там будет передаваться "", а не null так что разницы нет. В примере с null сравнивается на всякий случай.
     
  11. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Обычно-таки и делают "".equals, это надёжнее.
    if(str == null || "".equals(str)) ...
     
  12. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Я загрузил веб-часть в репозиторий
    На скрины попали чьи-то смешные шуточки, не обращайте внимания.

    1)Качаем базовый набор пакетов CMS MSC: WebSiteEngine 4 (тема)
    2)Заходим в админку (ссылка и данные для входа будут на главной странице нового сайта)
    3)Идем в раздел обновления
    4)Ставим все доступные обновления (для этого в разделе обновления жмем на ссылку "проверить наличие обновлений";рекомендую сначала обновить индексы всех репозиториев, потом пакет updater и после этого все оставшееся)
    5)Добавляем новый репозиторий "http://msc-repo.16mb.com/dev" или "http://qeop.ru/msc-repo/dev" в список
    [​IMG]
    6)Идем на страницу проверки обновлений и обновляем индекс нового репозитория
    7)Добавляем пакет MSC_SiteChat на странице редактирования списка пакетов
    [​IMG]
    8)Ставим все обновления, всё там же на странице "проверить наличие обновлений"
    С установкой все.

    Теперь надо настроить мост. Пока что удобного варианта настройки нет, но чуть позже допилю.
    Ну а сейчас приходится лазить в код.
    Итак, открываем в вашем любимом редакторе файл "{сайт}/cms/scripts/msc_bridge.php"
    И в строчке
    Код:
    private static $server = "http://localhost:8888/";
    
    Меняем localhost на ip вашего minecraft-сервера, а 8888 на порт API (по умолчанию 8080)

    Далее настраиваем API со стороны игрового сервера.
    Закидываем плагины на сервер, запускаем выключаем, чтоб появился конфиг. И теперь опять же в любимом редакторе открываем файл "{сервер_minecraft}/plugins/MSC_bridge/config.yml" и меняем параметр out.site следующим образом: localhost опять же меняем на адрес, но только уже сайта, далее если CMS стоит не в корне, то перед "?" дописываем путь. Все остальное можно оставить как есть, так как мы используем стандартный пакет для CMS.

    Теперь дело за малым. Надо где-нибудь в шаблоне оформления сайта разместить две строчки:
    Код:
     <content type="scripts" name="MSC_SiteChat" action="sendMessForm"/>
    <content type="script" name="MSC_SiteChat" action="showHistory"/>
    я их добавил в {сайт}/cms/templates/default/admin.html после блока с основным контентом и теперь они выводятся на всех страницах админки, даже не авторизированным пользователям.
    Все, на этом установка завершена.
     
  13. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    @GHOST-MEN , лови. В архиве последний API + плагин на чат.
    Исходников, скорее всего, не осталось. Объем небольшой, обфускации нет. Наверно, легко будет декомпилировать.

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

    Вложения:

    • msc_bridge.zip
      Размер файла:
      9 КБ
      Просмотров:
      8
  14. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Добавил гифку с демонстрацией работы, завтра будет сборка с веб-частью и сервером.
    Сейчас пока в очень корявом виде восстановил веб.

    Какой нынче лимит на размер загружаемых архивов?
    (Гифку пришлось грузить на свой сервак из-за мелкого лимита...)

    @GHOST-MEN , тебе поди под sponge нужен плагин?
     
  15. Krutius

    Krutius Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    MrPencilBox
    ОНО *ты* ЖИВОЕ?!
     
  16. GHOST-MEN

    GHOST-MEN Активный участник Пользователь

    Баллы:
    76
    Желательно под катёл и термос
     
  17. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Восстал из пепла)
    Заглядываю иногда на форум, еще реже что-то пишу

    И под тем и под другим работает, проверял на котле 1240 1.7.10 и термосе 1614 1.7.10
     
  18. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Пока-что не все исправил в вебе. В частности, если сервер оффлайн, то на странице будут ошибки. Да и в самом коде пока бардак.

    Плагины в папку plugins. В MCS_bridge/config.yml Вместо "http://plugin.localhost/" пишем путь до сайта, где будет развернут архив site.zip. С сервером все, можно запустить и заняться сайтом.

    site.zip разархивируем сначала где-то локально, правим в файле piccolo/config/minecraft_chat.json указываем ip\домен сервера с плагином. (порт должен совпадать с портом из конфига плагина) После этого можно грузить сайт на хост.
    Как только сервак поднимется, можно получить результат с гифки.

    Чтобы обновление чата на странице работало нормально, нужно разместить сайт в корне домена\субдомена. Позже на это будет фикс.

    Если сильно хочется вставить в dle или какой другой двиг:
    История чата подтягивается с "http://домен/?ajax=1&type=script&name=MSC_bridge&action=getHTMLChat"
    Сообщения можно слать в
    "http://домен/?ajax=1&type=script&name=MSC_bridge&action=sendMessForm", только предварительно в piccolo/config/minecraft_chat.json нужно поменять
    Код:
    "actions":["request","getHTMLChat"]
    на
    Код:
    "actions":["request","getHTMLChat","sendMessForm"]
    Если содержимое архива положить не в корень, то к домену дополнительно добавляется соответственно путь. В случае с этими запросами, все будет работать и вне корня домена.

    P.s. не тестил плагин, когда на сервере несколько игроков, возможно, обнаружатся какие-то дополнительные косяки. Если что будет - пишите сюда.​
     

    Вложения:

    • site.zip
      Размер файла:
      255,9 КБ
      Просмотров:
      6
    • plugins.zip
      Размер файла:
      9,4 КБ
      Просмотров:
      6
  19. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
    package danilko09.msc_sitechat;
    
    import danilko09.msc_bridge.MSC_bridge;
    import danilko09.msc_bridge.event_handler;
    import org.bukkit.Bukkit;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerChatEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import java.util.logging.Level;
    
    public class MSC_SiteChat extends JavaPlugin implements Listener, event_handler {
        private String[] str = new String[64]; //Queue?
        private int lst = 0;
        private MSC_bridge bridge;
    
        @Override
        public void onEnable() {
            this.bridge = (MSC_bridge) Bukkit.getPluginManager().getPlugin("MSC_bridge");
            this.bridge.addHandler("chat", this);
            getServer().getPluginManager().registerEvents(this, this);
            this.getLogger().info("MSC_SiteChat has been enabled!");
        }
    
        @EventHandler
        public void onChat(PlayerChatEvent event) {
            new Thread() {
                public void run() {
                    try {
                        bridge.callSite("chat", "");
                    } catch (Exception ex) {
                        getLogger().log(Level.WARNING, "(Un)Handled exception", ex);
                    }
                }
            }.start();
            String msg = "[" + event.getPlayer().getDisplayName() + "]" + event.getMessage();
            addToLog(msg);
        }
    
        private void addToLog(String msg) {
            if (lst < str.length) {
                str[lst] = msg;
                lst++;
            } else {
                int i;
                for (i = 1; i < str.length; i++) {
                    str[i - 1] = str[i];
                }
                str[i] = msg;
            }
        }
    
        @Override
        public String onRequest(String uri) {
            if (uri != null && !"".equals(uri)) {
                try {
                    uri = uri.substring(1, uri.length());
                    String res = this.bridge.callSite("chat", uri);
                    if (res != null && !"".equals(res)) {
                        String msg = "[site]" + "[" + uri + "]" + res;
                        Bukkit.broadcastMessage(msg);
                        addToLog(msg);
                    }
                } catch (Exception ex) {
                    getLogger().log(Level.WARNING, "(Un)Handled exception", ex);
                }
            }
            StringBuilder ret = new StringBuilder();
            for (String aStr : str) {
                if (aStr == null) {
                    break;
                }
                ret.append(aStr).append("\n");
            }
            return ret.toString();
        }
    }
     
  20. Автор темы
    danilko

    danilko Старожил Пользователь

    Баллы:
    103
    Ааа, боюсь боюсь, исходник слили

    К чему эта попытка демонстрации превосходства? Или что это было...
    Ты даже мог не расчехлять декомпилятор, ибо почти тот же самый код есть в шапке темы.

    Ну и
    все в той же шапке.

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

    Если слово "расческа" использовано как намек на отсутствие безопасности, то прошу тебя отправить сообщение в чат в обход сайта. Ну то есть поднимаешь сервак, поднимаешь веб, настраиваешь их друг на друга и пытаешься отослать сообщение каким-то прямым запросом к серверу.

    я думал в шапке достаточно понятно написано, что это просто демонстрационный плагин, не более
     

Поделиться этой страницей