Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

danilko

Старожил
Пользователь
Баллы
103
MSC_SiteChat - чат сервера на сайте:
Версия: v0.1
Плагин для демонстрации работы API(моста). Возможности самые минимальные, защиты почти нет. Использовать "на продакшене" можно, но не стоит.
Особенности:
  • Может выводить последние сообщения с сервера на сайте
  • Можно отправлять сообщения с сайта на сервер
  • Использует мост MSC_bridge
Скачать тестовый плагин
Подумал не стоит создавать отдельный репозиторий на github для одного файла. (ну ладно, трех ещё ж бинарник и plugin.yml)
В общем src:
Java:
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;
  }

}
Говнокодно... Позже причешу, чтоб глаза не резало.
Как работает:
chat.gif

(как получить такое: http://rubukkit.org/threads/chat-web-msc_sitechat.98495/#post-1535792)

Лог изменений:
Версия 0.1
  • Релиз плагина
 
Последнее редактирование:
Воу-воу-воу... Что с табуляцией? И комментарии-бы не помешали
С табуляцией всё было ок до "CTRL+C CTRL+V". Комментарии будут, как до причесывания дойду, это завтра, наверно.(Сейчас пока не могу, занят)
%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-02-16%2023.34.34.png

И обычно делают наоборот.
res.equals("")
Без разницы же. NetBeans предложил поменять, я согласился.
 
Потому что я писал выше, вот почему. (с)
Он всегда предлагает поменять.
К тебе уже Малышева бежит
%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-02-17%2009.51.44.png

NullPointerException жш, если вне контекста API смотреть. А так, у меня там будет передаваться "", а не null так что разницы нет. В примере с null сравнивается на всякий случай.
 
Обычно-таки и делают "".equals, это надёжнее.
if(str == null || "".equals(str)) ...
 
Я загрузил веб-часть в репозиторий
На скрины попали чьи-то смешные шуточки, не обращайте внимания.

1)Качаем базовый набор пакетов CMS MSC: WebSiteEngine 4 (тема)
2)Заходим в админку (ссылка и данные для входа будут на главной странице нового сайта)
3)Идем в раздел обновления
4)Ставим все доступные обновления (для этого в разделе обновления жмем на ссылку "проверить наличие обновлений";рекомендую сначала обновить индексы всех репозиториев, потом пакет updater и после этого все оставшееся)
5)Добавляем новый репозиторий "http://msc-repo.16mb.com/dev" или "http://qeop.ru/msc-repo/dev" в список
%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-02-17%2010.42.38.png

6)Идем на страницу проверки обновлений и обновляем индекс нового репозитория
7)Добавляем пакет MSC_SiteChat на странице редактирования списка пакетов
%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-02-17%2011.05.19.png

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 после блока с основным контентом и теперь они выводятся на всех страницах админки, даже не авторизированным пользователям.
Все, на этом установка завершена.
 
@GHOST-MEN , лови. В архиве последний API + плагин на чат.
Исходников, скорее всего, не осталось. Объем небольшой, обфускации нет. Наверно, легко будет декомпилировать.

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

Вложения:

  • msc_bridge.zip
    msc_bridge.zip
    Размер файла
    9 КБ
    Просмотров
    8
Добавил гифку с демонстрацией работы, завтра будет сборка с веб-частью и сервером.
Сейчас пока в очень корявом виде восстановил веб.

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

@GHOST-MEN , тебе поди под sponge нужен плагин?
 
Добавил гифку с демонстрацией работы, завтра будет сборка с веб-частью и сервером.
Сейчас пока в очень корявом виде восстановил веб.

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

@GHOST-MEN , тебе поди под sponge нужен плагин?
ОНО *ты* ЖИВОЕ?!
 
Пока-что не все исправил в вебе. В частности, если сервер оффлайн, то на странице будут ошибки. Да и в самом коде пока бардак.

Плагины в папку 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
    site.zip
    Размер файла
    255,9 КБ
    Просмотров
    6
  • plugins.zip
    plugins.zip
    Размер файла
    9,4 КБ
    Просмотров
    6
Java:
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();
    }
}
 
Java:
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();
    }
}
Ааа, боюсь боюсь, исходник слили

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

Ну и
Использовать "на продакшене" можно, но не стоит.
все в той же шапке.

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

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

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

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

Назад
Верх