/*
* Copyright 2012-2014 Nikolay A. Viguro
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ru.iris.common.source.vk;
import com.avaje.ebean.Ebean;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import ru.iris.common.database.model.Task;
import ru.iris.common.datasource.model.VKModel;
import ru.iris.common.messaging.model.command.CommandAdvertisement;
import ru.iris.common.source.vk.entities.User;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by nikolay.viguro on 10.10.2014.
*/
public class VKSource
{
private static final Logger LOGGER = LogManager.getLogger(VKSource.class);
private static final Gson gson = new GsonBuilder().create();
/**
* Singleton (On Demand Holder)
*/
public static class SingletonHolder
{
public static final VKSource HOLDER_INSTANCE = new VKSource();
}
public static VKSource getInstance()
{
return SingletonHolder.HOLDER_INSTANCE;
}
private VKSource()
{
}
public void populateBirthDayCalendar(String obj)
{
LOGGER.info("Populate calendar events from VK source");
try
{
Calendar cal = Calendar.getInstance();
VKModel source = gson.fromJson(obj, VKModel.class);
VKConnector vkConnector = VKConnectorImpl.createInstance();
VKTokenProvider vkTokenProvider = VKTokenProviderImpl.createInstance(source.getAccesstoken());
List<User> usersvk = vkConnector.getUsers(null, "nom", vkTokenProvider.getToken());
if (usersvk == null) {
LOGGER.error("Error while getting list of VK users!");
return;
}
User me = usersvk.get(0);
List<User> users = vkConnector.getUsers(vkConnector.getFriends(me, vkTokenProvider.getToken()), "nom", vkTokenProvider.getToken());
for (User user : users)
{
LOGGER.debug("User: " + user.getFirstName() + " " + user.getLastName() + " BirthDay: " + user.getBdate());
String bdate = user.getBdate();
// оторвать яйца тем кто придумал в таком виде отдавать даты!!!
if (bdate != null)
{
if (!bdate.matches("\\d+\\.\\d+\\.\\d+"))
{
bdate += "." + Calendar.getInstance().get(Calendar.YEAR);
}
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
dateFormat.setLenient(true);
cal.setTime(dateFormat.parse(bdate));
cal.set(Calendar.YEAR, LocalDateTime.now().getYear());
cal.set(Calendar.HOUR_OF_DAY, 10);
cal.set(Calendar.MINUTE, 10);
Task saved = Ebean.find(Task.class).where().eq("title", "День рождения " + user.getFirstName() + " " + user.getLastName()).findUnique();
if (saved == null)
{
Task task = new Task();
task.setStartdate(new Timestamp(cal.getTime().getTime()));
cal.add(Calendar.HOUR_OF_DAY, 10);
Map<String, String> map = new HashMap<>();
map.put("text", "Сегодня празднует день рождения ваш друг - " + user.getFirstName() + " " + user.getLastName());
CommandAdvertisement adv = new CommandAdvertisement();
adv.setData(map);
adv.setScript("vk-birthday-say.js");
task.setEnddate(new Timestamp(cal.getTime().getTime()));
task.setTitle("День рождения " + user.getFirstName() + " " + user.getLastName());
task.setText("Сегодня празднует день рождения ваш друг - " + user.getFirstName() + " " + user.getLastName());
task.setSource("vk");
task.setObj(gson.toJson(adv));
task.setSubject("event.command");
task.setScript("vk-birthday-say.js");
task.setClazz("ru.iris.scheduler.jobs.SendCommandAdvertisementJob");
// every hour
task.setPeriod("" + 60L * 60L * 1000L);
task.setShowInCalendar(true);
task.setEnabled(true);
task.save();
} else {
if (!saved.getStartdate().equals(new Timestamp(cal.getTime().getTime()))) {
LOGGER.debug("Update startdate for " + saved.getTitle());
saved.setStartdate(new Timestamp(cal.getTime().getTime()));
cal.add(Calendar.HOUR_OF_DAY, 10);
saved.setEnddate(new Timestamp(cal.getTime().getTime()));
saved.save();
}
}
}
}
LOGGER.info("Populate calendar events from VK source - done! Parsed " + users.size() + " events");
}
catch (Exception e)
{
LOGGER.error("VK error: ", e);
}
// Manually run GC
System.gc();
}
}