//The MIT License
//
//Copyright (c) 2009 nodchip
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
package tv.dyndns.kishibe.qmaclone.client;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import tv.dyndns.kishibe.qmaclone.client.game.ProblemGenre;
import tv.dyndns.kishibe.qmaclone.client.game.ProblemType;
import tv.dyndns.kishibe.qmaclone.client.packet.NewAndOldProblems;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketUserData;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketUserData.WebSocketUsage;
import tv.dyndns.kishibe.qmaclone.client.setting.PanelSettingChat;
import com.google.common.base.Strings;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class UserData implements CloseHandler<Window> {
private static final Logger logger = Logger.getLogger(UserData.class.getName());
private static final UserData INSTANCE = new UserData();
private final RepeatingCommand commandLoadFromServer = new RepeatingCommand() {
@Override
public boolean execute() {
loadFromServer();
return false;
}
};
public static UserData get() {
return INSTANCE;
}
private UserData() {
if (GWT.isClient()) {
Window.addCloseHandler(this);
load();
}
}
private PacketUserData data = new PacketUserData();
private final List<UserDataLoadListener> loadListeners = new ArrayList<UserDataLoadListener>();
private boolean ready = false;
private static final String KEY_USER_CODE = "user_code";
public void load() {
String s = Cookies.getCookie(KEY_USER_CODE);
if (Strings.isNullOrEmpty(s) || 8 < s.length() || s.equals("0")) {
createUserCode();
return;
}
data.userCode = Integer.parseInt(s);
loadFromServer();
}
private void createUserCode() {
Service.Util.getInstance().getNewUserCode(callbackCreateUserCode);
}
private final AsyncCallback<Integer> callbackCreateUserCode = new AsyncCallback<Integer>() {
public void onSuccess(Integer result) {
data.userCode = result;
Cookies.setCookie(KEY_USER_CODE, Integer.toString(data.userCode), getExpireTime());
save();
callLoadListeners();
}
public void onFailure(Throwable caught) {
logger.log(Level.WARNING, "新規ユーザーコードの取得に失敗しました", caught);
}
};
private void loadFromServer() {
Service.Util.getInstance().loadUserData(data.userCode, callbackLoadFromServer);
}
private final AsyncCallback<PacketUserData> callbackLoadFromServer = new AsyncCallback<PacketUserData>() {
public void onSuccess(PacketUserData result) {
data = result;
Cookies.setCookie(KEY_USER_CODE, Integer.toString(data.userCode), getExpireTime());
save();
callLoadListeners();
for (int ignoreUserCode : data.ignoreUserCodes) {
PanelSettingChat.getInstance().addIgnoreUserCodeButton(ignoreUserCode);
}
}
public void onFailure(Throwable caught) {
Scheduler.get().scheduleFixedDelay(commandLoadFromServer, 5000);
logger.log(Level.WARNING, "ユーザー情報の取得中にエラーが発生しました。パケットを再送します。", caught);
}
};
private void callLoadListeners() {
ready = true;
for (UserDataLoadListener userDataLoadListener : loadListeners) {
userDataLoadListener.onLoad();
}
loadListeners.clear();
}
public void addLoadListener(UserDataLoadListener listener) {
if (ready) {
listener.onLoad();
} else {
loadListeners.add(listener);
}
}
public void save() {
Cookies.setCookie(KEY_USER_CODE, Integer.toString(data.userCode), getExpireTime());
Service.Util.getInstance().saveUserData(data, callbackSaveUserData);
}
private final AsyncCallback<Void> callbackSaveUserData = new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
}
@Override
public void onFailure(Throwable caught) {
logger.log(Level.WARNING, "ユーザーデータの保存に失敗しました", caught);
}
};
private Date getExpireTime() {
long currentTime = System.currentTimeMillis();
currentTime += 90L * 24L * 60L * 60L * 1000L;
return new Date(currentTime);
}
public void setPlayerName(String playerName) {
data.playerName = playerName;
}
public String getPlayerName() {
return data.playerName;
}
public void setHighScore(int score) {
data.highScore = score;
}
public int getHighScore() {
return data.highScore;
}
public void setAverageScore(int score) {
data.averageScore = score;
}
public int getAverageScore() {
return data.averageScore;
}
public void setPlayCount(int playCount) {
data.playCount = playCount;
}
public int getPlayCount() {
return data.playCount;
}
public void setRating(int rating) {
data.rating = rating;
}
public int getRating() {
return data.rating;
}
public void setLevelName(int levelName) {
data.levelName = levelName;
}
public int getLevelName() {
return data.levelName;
}
public void setLevelNumber(int levelNumber) {
data.levelNumber = Math.max(0, levelNumber);
}
public int getLevelNumber() {
return data.levelNumber;
}
public void setAvarageRank(float averageRank) {
data.averageRank = averageRank;
}
public float getAverageRank() {
return data.averageRank;
}
public void setGenres(Set<ProblemGenre> genres) {
data.genres = genres;
}
public Set<ProblemGenre> getGenre() {
return data.genres;
}
public void setTypes(Set<ProblemType> types) {
data.types = types;
}
public Set<ProblemType> getTypes() {
return data.types;
}
public void setGreeting(String greeting) {
data.greeting = greeting;
}
public String getGreeting() {
return data.greeting;
}
public void setClassLevel(int classLevel) {
data.classLevel = classLevel;
}
public int getClassLevel() {
return data.classLevel;
}
public void setUserCode(int userCode) {
data.userCode = userCode;
if (GWT.isClient()) {
Cookies.setCookie(KEY_USER_CODE, "" + data.userCode, getExpireTime());
}
}
public int getUserCode() {
return data.userCode;
}
public void setImageFileName(String imageFileName) {
data.imageFileName = imageFileName;
}
public String getImageFileName() {
return data.imageFileName;
}
public int[][][] getCorrectCount() {
return data.correctCount;
}
public void setPlaySound(boolean playSound) {
data.playSound = playSound;
}
public boolean isPlaySound() {
return data.playSound;
}
public boolean isMultiGenre() {
return data.multiGenre;
}
public void setMultiGenre(boolean multiGenre) {
data.multiGenre = multiGenre;
}
public boolean isMultiType() {
return data.multiType;
}
public void setMultiType(boolean multiType) {
data.multiType = multiType;
}
public int getDifficultSelect() {
return data.difficultSelect;
}
public void setDifficultSelect(int difficultSelect) {
data.difficultSelect = difficultSelect;
}
public NewAndOldProblems getNewAndOldProblems() {
return data.newAndOldProblems;
}
public void setNewAndOldProblems(NewAndOldProblems newAndOldProblems) {
data.newAndOldProblems = newAndOldProblems;
}
public boolean isRankingMove() {
return data.rankingMove;
}
public void setRankingMove(boolean rankingMove) {
data.rankingMove = rankingMove;
}
public int getBbsDispInfo() {
return data.bbsDispInfo;
}
public void setBbsDispInfo(int dispInfo) {
data.bbsDispInfo = dispInfo;
}
public boolean isBbsAge() {
return data.bbsAge;
}
public void setBbsAge(boolean age) {
data.bbsAge = age;
}
public int getPrefecture() {
return data.prefecture;
}
public void setPrefecture(int prefecture) {
data.prefecture = prefecture;
}
public boolean isChatEnabled() {
return data.chat;
}
public void setChatEnabled(boolean chatEnabled) {
data.chat = chatEnabled;
}
public boolean isPublicEvent() {
return data.publicEvent;
}
public void setPublicEvent(boolean publicEvent) {
data.publicEvent = publicEvent;
}
public boolean isHideAnswer() {
return data.hideAnswer;
}
public void setHideAnswer(boolean hideAnswer) {
data.hideAnswer = hideAnswer;
}
public boolean isShowInfo() {
return data.showInfo;
}
public void setShowInfo(boolean showInfo) {
data.showInfo = showInfo;
}
public void setReflectEventResult(boolean reflectEventResult) {
data.reflectEventResult = reflectEventResult;
}
public boolean isReflectEventResult() {
return data.reflectEventResult;
}
public void setWebSocketUsage(WebSocketUsage webSocketUsage) {
data.webSocketUsage = webSocketUsage;
}
public WebSocketUsage getWebSocketUsage() {
return data.webSocketUsage;
}
public void setVolatility(int volatility) {
data.volatility = volatility;
}
public int getVolatility() {
return data.volatility;
}
public void setQwertyHiragana(boolean qwertyHiragana) {
data.qwertyHiragana = qwertyHiragana;
}
public boolean isQwertyHiragana() {
return data.qwertyHiragana;
}
public void setQwertyKatakana(boolean qwertyKatakana) {
data.qwertyKatakana = qwertyKatakana;
}
public boolean isQwertyKatakana() {
return data.qwertyKatakana;
}
public void setQwertyAlphabet(boolean qwertyAlphabet) {
data.qwertyAlphabet = qwertyAlphabet;
}
public boolean isQwertyAlphabet() {
return data.qwertyAlphabet;
}
public boolean isRegisterCreatedProblem() {
return data.registerCreatedProblem;
}
public void setRegisterCreatedProblem(boolean registerCreatedProblem) {
data.registerCreatedProblem = registerCreatedProblem;
}
public boolean isRegisterIndicatedProblem() {
return data.registerIndicatedProblem;
}
public void setRegisterIndicatedProblem(boolean registerIndicatedProblem) {
data.registerIndicatedProblem = registerIndicatedProblem;
}
public String getGooglePlusId() {
return data.googlePlusId;
}
public void setGooglePlusId(String googlePlusId) {
data.googlePlusId = googlePlusId;
}
public String getTheme() {
return data.theme;
}
public void setTheme(String theme) {
data.theme = theme;
}
@Override
public void onClose(CloseEvent<Window> event) {
// save();
}
}