From 10dcb7324fac83c0190ff4a842360a035449f278 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Tue, 20 Jun 2023 07:10:16 +0300 Subject: VK: read premium status using Callback API --- src/main/java/com/juick/service/VKService.java | 94 ++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/main/java/com/juick/service/VKService.java (limited to 'src/main/java/com/juick/service/VKService.java') diff --git a/src/main/java/com/juick/service/VKService.java b/src/main/java/com/juick/service/VKService.java new file mode 100644 index 00000000..14d7e3e9 --- /dev/null +++ b/src/main/java/com/juick/service/VKService.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2008-2023, Juick + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.juick.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.scribejava.apis.VkontakteApi; +import com.github.scribejava.core.builder.ServiceBuilder; +import com.github.scribejava.core.model.OAuth2AccessToken; +import com.github.scribejava.core.model.OAuthRequest; +import com.github.scribejava.core.model.Response; +import com.github.scribejava.core.model.Verb; +import com.github.scribejava.core.oauth.OAuth20Service; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.inject.Inject; + +@Service +public class VKService { + private static final Logger logger = LoggerFactory.getLogger("VK"); + @Value("${vk_appid:appid}") + private String VK_APPID; + @Value("${vk_secret:secret}") + private String VK_SECRET; + private static final String VK_REDIRECT = "https://juick.com/_vklogin"; + @Inject + private ObjectMapper jsonMapper; + @Inject + private UserService userService; + private OAuth20Service vkAuthService; + + @PostConstruct + public void init() { + ServiceBuilder vkBuilder = new ServiceBuilder(VK_APPID); + setVkAuthService(vkBuilder.apiSecret(VK_SECRET) + .defaultScope("friends,wall,offline,groups") + .callback(VK_REDIRECT) + .build(VkontakteApi.instance())); + } + + public void updatePremiumStatus(Integer userId) { + var vkUser = userService.getVkTokens(userId); + if (vkUser != null) { + OAuth2AccessToken token = new OAuth2AccessToken(vkUser.getRight()); + OAuthRequest donRequest = new OAuthRequest(Verb.GET, + "https://api.vk.com/method/donut.isDon?owner_id=-67669480&v=5.131"); + getVkAuthService().signRequest(token, donRequest); + try (Response vkResponse = getVkAuthService().execute(donRequest)) { + if (vkResponse.isSuccessful()) { + logger.info(vkResponse.getBody()); + var response = jsonMapper.readTree(vkResponse.getBody()); + if (response.has("response")) { + var isDon = response.get("response").intValue() > 0; + logger.info("{} is Don: {}", vkUser.getLeft(), isDon); + userService.setPremium(userId, isDon); + } else { + // token is expired or does not have "groups" permissions + userService.updateVkToken(userId, ""); + } + } + } catch (Exception e) { + logger.error("Don request error", e); + } + } else { + logger.warn("User is not connected to VK: {}", userId); + } + } + + public OAuth20Service getVkAuthService() { + return vkAuthService; + } + + public void setVkAuthService(OAuth20Service vkAuthService) { + this.vkAuthService = vkAuthService; + } +} -- cgit v1.2.3