Использование VK API - U61vashka/VK-API-Bukkit-Bungee Wiki

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

Прежде чем использовать VK-API, вам нужно импортировать её в свой проект

Maven

Чтобы импортировать добавьте это в ваш pom.xml или Gradle.build
Замените {Версия} на нынешнюю версию Замените [модуль] на доступные модули: bukkit,bungee,velocity,core

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

Gradle

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

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

Следующий шаг добавить в plugin.yml VK-API как depend или же softdepend

Пример 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.

Ивенты

Спигот


import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import com.ubivashka.vk.bukkit.events.VKMessageEvent;

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

Банжа


import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;

import com.ubivashka.vk.bungee.events.VKMessageEvent;

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

Использование методов с VK Java SDK

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

Внимание!!! Все методы VK Java SDK могут использоваться в Bukkit, Bungee, Velocity

  • Условия методов

    • Если вы собираетесь отправить сообщение/конвертировать буквенный id юзера в цифренный, нужно использовать метод execute() (Не касается создания объектов к примеру клавиатур)
    • При использовании execute, этот метод выкинет API exception(Ошибка на стороне сервера(Примеры: синтаксическая ошибка, неправильный аргумент)), либо же ClientException(Ошибка на стороне клиента (Пример: нету доступа к сайту)). Поэтому всегда нужно закрывать с помощью try catch эти ошибки.
    • В некоторых методах VK API присутствует GroupActor, и вместо него используется UserActor. Не пытайтесь использовать ивент если там нужно передать UserActor или ServiceActor (Если конечно же нету ключа доступа к вк аккаунту)
      • К примеру:
        // В примере используется баккит, но вы можете так же сделать и в банже и в Velocity:
        // BungeeVkApiPlugin.getInstance().getVkApiProvider()...
        // VelocityVkApiPlugin.getInstance().getVkApiProvider()...
        private final static VkApiClient VK = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider().getVkApiClient();
	private final static GroupActor ACTOR = BukkitVkApiPlugin.getPlugin(BukkitVkApiPlugin.class).getVkApiProvider().getActor();

	private void createPoll() {
                //У нас возникает синтаксическая ошибка, потому что create принимает UserActor, но не принимает GroupActor. Из чего мы можем понять то что нельзя создать опрос через группу используя VK-API
		VK.polls().create(ACTOR);
	}
  • Пример использования метода с документации ВК. Клик

    • Метод messages.send отправляет сообщение по userId или же peerId (К примеру его можно получить с класса Conservation или же Message)
import java.util.Random;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import com.ubivashka.vk.bukkit.BukkitVkApiPlugin;
import com.ubivashka.vk.bukkit.events.VKMessageEvent;
import com.vk.api.sdk.client.VkApiClient;
import com.vk.api.sdk.client.actors.GroupActor;
import com.vk.api.sdk.exceptions.ApiException;
import com.vk.api.sdk.exceptions.ClientException;

public class VKListener 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) {
		try {
                              // Сначало мы добавляем в метод send аргумент GroupActor (Чтобы передался его
			// id), после этого добавляем randomId(его обязательно нужно передавать, иначе
			// VK выведет ошибку), выставляем peerId (вместо него мы можем использовать
			// userId, чтобы написать только 1 человеку), поле message обязательно если в
			// сообщений нету прикрепленных фотографий, или фото

			CLIENT.messages().send(ACTOR).randomId(RANDOM.nextInt()).peerId(e.getPeer()).message("Текст сообщения").execute();
		} catch (ApiException | ClientException e1) {
			e1.printStackTrace();
		}
	}
}
  • Пример создания клавиатуры

    • Советую прочитать про структуру клавиатуры для лучшего понимания
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

import com.ubivashka.vk.bukkit.BukkitVkApiPlugin;
import com.ubivashka.vk.bukkit.events.VKMessageEvent;
import com.vk.api.sdk.client.VkApiClient;
import com.vk.api.sdk.client.actors.GroupActor;
import com.vk.api.sdk.exceptions.ApiException;
import com.vk.api.sdk.exceptions.ClientException;
import com.vk.api.sdk.objects.messages.Keyboard;
import com.vk.api.sdk.objects.messages.KeyboardButton;
import com.vk.api.sdk.objects.messages.KeyboardButtonAction;
import com.vk.api.sdk.objects.messages.KeyboardButtonColor;
import com.vk.api.sdk.objects.messages.TemplateActionTypeNames;

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()) // https://vk.com/dev/messages.send
					.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;
	}
}

  • Итог:
    keyboard_example

  • Превращение screenName (У некоторых юзеров вместо id вк, используется текст, это и называется screenName) в id (1)

    • В будущем вам могут пригодится использование других методов, к примеру узнать подписан ли юзер в вашу группу, поэтому советую почитать список методов от ВК
        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(); // https://vk.com/dev/utils.resolveScreenName
		} catch (ApiException | ClientException ignored) {
			CLIENT.messages().send(ACTOR).randomId(RANDOM.nextInt()).peerId(e.getPeer()).message("Произошла ошибка!") // https://vk.com/dev/messages.send
					.execute();
			return;
		}
		Integer id = 1;
		if (screenNameResponse.getType() == DomainResolvedType.GROUP) {
			id = screenNameResponse.getGroupId(); // У групп свой id
		} else { // Если это не группа используем getObjectId
			id = screenNameResponse.getObjectId();
		}
		CLIENT.messages().send(ACTOR).randomId(RANDOM.nextInt()).peerId(e.getPeer()).message("ID: " + id).execute(); // 
https://vk.com/dev/messages.send
	}
  • Итог: vk_resolve_screenname_example
⚠️ **GitHub.com Fallback** ⚠️