package com.alkor.vph.tasks; import com.alkor.vph.samples.hh.entities.Vacancy; import com.alkor.vph.vk.VKConnector; import com.alkor.vph.vk.entities.*; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; /** * Author: akorobitsyn * Date: 03.09.13 * Time: 19:01 */ public class VacancyGroupPostTask implements VKBotTask { private final static String postTemplate = "%s%s\n%s - %s"; private final static long gid = -57947576; private final Log log = LogFactory.getLog(VacancyGroupPostTask.class); private VKConnector vkConnector; private Vacancy vacancy; private long minSalary = 100000; public VacancyGroupPostTask(VKConnector vkConnector, Vacancy vacancy) { this.vkConnector = vkConnector; this.vacancy = vacancy; } @Override public String getTaskId() { return "vacancy-" + String.valueOf(vacancy.getId()); } @Override public MethodResult post(Captcha captcha, String token) throws IOException, InterruptedException { Post post = createPost(vacancy, token); WallPostResult wallPostResult = vkConnector.wallPost(gid, post, captcha, token); if (wallPostResult.getPostId() == -13) { wallPostResult.setSuccess(false); wallPostResult.setErrorCode(5); wallPostResult.setMessage("PostId = -13"); } //TODO: set group status //vkConnector.setStatus(post.getMessage(), token); return wallPostResult.getMethodResult(); } @Override public boolean shouldBeSkipped() { if (vacancy.getMaxSalary() != null && vacancy.getMaxSalary() < minSalary) { return true; } if (vacancy.getMinSalary() == null || vacancy.getMinSalary() < minSalary) { return true; } return false; } private Post createPost(Vacancy vacancy, String token) { Post post = new Post(); String salary = ""; if (vacancy.getMinSalary() != null) { if (vacancy.getMinSalary().equals(vacancy.getMaxSalary())) { salary = String.valueOf(vacancy.getMinSalary()); } else { salary = " от " + String.valueOf(vacancy.getMinSalary()); if (vacancy.getMaxSalary() != null) { salary += (" до " + String.valueOf(vacancy.getMaxSalary())); } } } else { if (vacancy.getMaxSalary() != null) { salary = " до " + String.valueOf(vacancy.getMaxSalary()); } } if (!salary.isEmpty()) { salary += (" " + vacancy.getSalaryCurrencyName()); } String location = vacancy.getAreaName(); if (vacancy.getMetro() != null) { location += (", м." + vacancy.getMetro()); } String message = String.format(postTemplate, vacancy.getName(), salary, vacancy.getEmployerName(), location); post.setMessage(message); List<String> attachments = new ArrayList<String>(); attachments.add(vacancy.getUrl()); try { attachments.add(savePhoto(vacancy.getEmployerIconUrl(), token)); } catch (Exception e) { log.error("Employer url hasn't been saved", e); } post.setAttachments(attachments); post.setLatitude(vacancy.getLatitude()); post.setLongitude(vacancy.getLongitude()); post.setFromGroup(true); return post; } private String savePhoto(String photoUrl, String token) throws IOException, InterruptedException { URL url = new URL(photoUrl); InputStream is = url.openStream(); byte[] bytes = IOUtils.toByteArray(is); is.close(); return vkConnector.uploadWallPhoto(token, bytes); } }