package tv.dyndns.kishibe.qmaclone.server.sns;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem;
import tv.dyndns.kishibe.qmaclone.server.database.Database;
import tv.dyndns.kishibe.qmaclone.server.database.DatabaseException;
import tv.dyndns.kishibe.qmaclone.server.util.Downloader;
import tv.dyndns.kishibe.qmaclone.server.util.DownloaderException;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import com.restfb.DefaultFacebookClient;
import com.restfb.Parameter;
import com.restfb.Version;
import com.restfb.types.FacebookType;
public class FacebookClient implements SnsClient {
private static final Logger logger = Logger.getLogger(FacebookClient.class.getName());
private final Database database;
private final Downloader downloader;
@Inject
public FacebookClient(Database database, Downloader downloader) {
this.database = Preconditions.checkNotNull(database);
this.downloader = Preconditions.checkNotNull(downloader);
}
@Override
public void postProblem(PacketProblem problem) {
String problemReportSentence = problem.getProblemReportSentence();
String message = "問題番号" + problem.id + ":" + problemReportSentence
+ " http://kishibe.dyndns.tv/qmaclone/";
post(message);
}
@Override
public void postThemeModeUpdate(String theme) {
String message = "テーマモード 「" + theme + "」 が更新されました" + " http://kishibe.dyndns.tv/qmaclone/";
post(message);
}
private void post(String message) {
String accessToken = getPageAccessToken();
com.restfb.FacebookClient facebookClient = new DefaultFacebookClient(accessToken,
Version.UNVERSIONED);
facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", message));
}
@Override
public void followBack() {
throw new UnsupportedOperationException();
}
@VisibleForTesting
String getPageAccessToken() {
String accessToken;
try {
accessToken = database.getPassword("facebook_access_token");
} catch (DatabaseException e) {
logger.log(Level.WARNING, "Failed to get the access token from the database.", e);
return null;
}
URL url;
try {
url = new URL("https://graph.facebook.com/1060467615/accounts?access_token=" + accessToken);
} catch (MalformedURLException e) {
logger.log(Level.WARNING, "URLオブジェクトの構築に失敗しました", e);
return null;
}
String json;
try {
json = downloader.downloadAsString(url);
} catch (DownloaderException e) {
logger.log(Level.WARNING, "ページアクセストークンの取得に失敗しました", e);
return null;
}
List<String> elements = ImmutableList.copyOf(json.replaceAll("\\s", "").split("\""));
int accessTokenIndex = elements.indexOf("access_token");
if (accessTokenIndex == -1) {
return null;
}
return elements.get(accessTokenIndex + 2);
}
}