Использование VK API - bivashy/VK-API-PluginAdapter GitHub Wiki

Установка в проект

Замените {Версия} на нынешнюю версию ()

Замените {модуль} на доступные модули: bukkit, bungee, velocity, core

Maven

        <repositories>
            <repository>
                <id>jitpack.io</id>
                <url>https://jitpack.io</url>
            </repository>
	</repositories>
        <dependencies>
            <dependency>
	        <groupId>com.github.U61vashka.VK-API-PluginAdapter</groupId>
	        <artifactId>vk-api.{модуль}</artifactId>
	        <version>{Версия}</version>
                <scope>provided</scope>
	    </dependency>
        </dependencies>

Gradle

        repositories {
		maven { url 'https://jitpack.io' }
	}
         
        dependencies {
	        implementation 'com.github.U61vashka.VK-API-PluginAdapter:vk-api.{модуль}:{Версия}'
	}

Зависимость в plugin.yml

SoftDepend:

name: ExamplePlugin
version: 1.0
author: author
main: your.main.path.here
softdepend: [VK-API] # Используйте если ваш плагин работает и без VK-API

Depend:

name: ExamplePlugin
version: 1.0
author: author
main: your.main.path.here
depend: [VK-API] # Используйте если ваш не плагин работает без VK-API

Ошибка Provider org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor not found при компиляции

  • Чтобы исправить запустите компиляцию с аргументом: "-proc:none"

  • Если у вас плагин maven-compiler-plugin:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <compilerArgs>
                    <arg>-proc:none</arg> <---------- Вот такой аргумент компиляции нужно добавить.
                </compilerArgs>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
    

Базовое использование VK-API.

Ивенты

Bukkit или Bungee

public class VKListener implements Listener{
	
	@EventHandler
	public void onVKMessage(VKMessageEvent e) {
          
	}
}

Использование методов с VK документации

P.S. Так же вы можете посмотреть примеры плагина


Пример использования метода с документации ВК. https://dev.vk.com/method/messages.send

Метод messages.send отправляет сообщение по userId или же peerId

public class VKListener implements Listener{
	private static final VkApiClient CLIENT = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getVkApiClient();
	private static final GroupActor ACTOR = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getActor();
	private final static Random RANDOM = new Random();

	@EventHandler
	public void onMessage(VKMessageEvent e) {
		try {
			CLIENT.messages().send(ACTOR)
                                         .randomId(RANDOM.nextInt())
                                         .peerId(e.getPeer())
                                         .message("Текст сообщения")
                                         .execute();
		} catch (ApiException | ClientException ex) {
			ex.printStackTrace();
		}
	}
}

Данный код будет отвечать на все наши сообщения Текст сообщения:

messages.send-example

Пример создания и отправки клавиатуры

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

public class KeyboardExample implements Listener {
	private final static VkApiClient CLIENT = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getVkApiClient();
	private final static GroupActor ACTOR = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getActor();
	private final static Random RANDOM = new Random();

	@EventHandler
	public void onMessage(VKMessageEvent e) {
		if (!e.getMessage().getText().startsWith("клава"))
			return;
		try {
			// keyboard прикрепляет клавиатуру в сообщение, если прикрепить null, то
			// клавиатура исчезнет
			CLIENT.messages().send(ACTOR)
                                         .randomId(RANDOM.nextInt())
                                         .keyboard(createKeyboard())
                                         .peerId(e.getPeer())
					 .message("Текст сообщения")
                                         .execute();
		} catch (ApiException | ClientException e1) {
			e1.printStackTrace();
		}
	}

	public Keyboard createKeyboard() {
		// Создаем пустую клавиатуру
		Keyboard keyboard = new Keyboard();
		// Создаем двухмерный список
		List<List<KeyboardButton>> allKey = new ArrayList<>();
		// Создаем первую линию клавиатуры
		List<KeyboardButton> line1 = new ArrayList<>();
		// Создаем кнопку
		KeyboardButton button = new KeyboardButton();
		// Создаем действие при нажатии на кнопку
		KeyboardButtonAction action = new KeyboardButtonAction();
		// Устанавливаем текст на кнопке
		action.setLabel("Текст на кнопку");
		// Тип кнопки (Доступные типы: CALLBACK, OPEN_APP, OPEN_LINK,
		// OPEN_PHOTO, START, TEXT, VKPAY)
		// CALLBACK - CallBack кнопка, и при нажатии на кнопку вызывается ивент
		// VKCallbackButtonPressEvent. Советую использовать
		// action.setPayload("тутУникальныйТекстДляКнопки") для того чтобы можно было
		// иметь много callback кнопок, и чтобы каждый из них отвечал за определенные
		// действия

		// OPEN_APP - action.setAppId(id приложения) чтобы установить какое приложение
		// ВК должно открываться

		// OPEN_LINK - action.setLink(ссылка) чтобы установить открытие ссылки при
		// нажатии

		// START - клавиатура появляется если у пользователя нету переписки с ботом

		// TEXT - вводит текст в Label (В нашем случае пользователь введёт 'Текст на
		// кнопку') от имени пользователя

		action.setType(TemplateActionTypeNames.TEXT);
		// Устанавливаем действие при клике
		button.setAction(action);

		// Устаналиваем цвет кнопки (Доступные цвета: DEFAULT, NEGATIVE, POSITIVE,
		// PRIMARY)
		button.setColor(KeyboardButtonColor.DEFAULT);
		// Добавляем кнопку в линию
		line1.add(button);
		// Создаем вторую линию клавиатуры
		List<KeyboardButton> line2 = new ArrayList<>();
		// Добавляем кнопку в вторую линию
		line2.add(new KeyboardButton()
				.setAction(new KeyboardButtonAction().setLabel("/помощь").setType(TemplateActionTypeNames.TEXT))
				.setColor(KeyboardButtonColor.NEGATIVE));
		// Добавляем линии в наш двухмерный список
		allKey.add(line1);
		allKey.add(line2);
		// keyboard.setInline(true) Прикрепляет клавиатуру на сообщение
		// keyboard.setOneTime(true) После использования клавиатура исчезает
		// ВНИМАНИЕ! Inline и OneTime вместе не работают
		// Устанавливаем кнопки (Нужно выставить двухмерный массив)
		keyboard.setButtons(allKey);
		return keyboard;
	}
}

В результате мы отправляем 2 кнопки которые находятся в двух строках

keyboard_example


Превращение буквенного айди (screen name) в цифренный айди (id)

        private final static VkApiClient CLIENT = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getVkApiClient();
	private final static GroupActor ACTOR = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider()
			.getActor();
	private final static Random RANDOM = new Random();

	@EventHandler
	public void onMessage(VKMessageEvent e) throws ApiException, ClientException {
		String command = "Какой id: ";

		if (!(e.getMessage().getText().startsWith(command)))
			return;

		if (e.getMessage().getText().length() == command.length())
			return;

		String screenName = e.getMessage().getText().substring(command.length());
		ResolveScreenNameResponse screenNameResponse = null;
		try {
			screenNameResponse = CLIENT.utils()
                                                   .resolveScreenName(ACTOR, screenName)
                                                   .execute();
		} catch (ApiException | ClientException ex) {
			CLIENT.messages().send(ACTOR)
                                         .randomId(RANDOM.nextInt())
                                         .peerId(e.getPeer())
                                         .message("Произошла ошибка!")
					 .execute();
                        ex.printStackTrace();
			return;
		}

		int id = 1;
		if (screenNameResponse.getType() == DomainResolvedType.GROUP) {
			id = screenNameResponse.getGroupId();
		} else {
			id = screenNameResponse.getObjectId();
		}
		CLIENT.messages().send(ACTOR)
                                 .randomId(RANDOM.nextInt())
                                 .peerId(e.getPeer())
                                 .message("ID: " + id)
                                 .execute();
	}

В итоге мы реализовали простого вк бота который получает цифренный айди, из буквенного:

resolve-screen-name-bot

⚠️ **GitHub.com Fallback** ⚠️