/* * 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; } }