import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
import jp.sourceforge.jindolf.corelib.LandDef;
import jp.sourceforge.jindolf.corelib.PeriodType;
* 人気のないプロローグなどで、
* 24時間以上の期間を持つPeriodが生成される可能性の考慮が必要。
*/
-public class Period{
+public final class Period{
// TODO Comparable も implement する?
private final Village homeVillage;
private int limitHour;
private int limitMinute;
// TODO 更新月日も入れるべきか。
- private String loginName;
- private boolean isFullOpen = false;
private final List<Topic> topicList = new LinkedList<>();
private final List<Topic> unmodList =
/**
* Periodを生成する。
- * この段階では発言データのロードは行われない。
- * デフォルトで非Hot状態。
+ *
+ * <p>この段階では発言データのロードは行われない。
+ *
* @param homeVillage 所属するVillage
* @param periodType Period種別
* @param day Period通番
* @throws java.lang.NullPointerException 引数にnullが渡された場合。
*/
public Period(Village homeVillage,
- PeriodType periodType,
- int day)
- throws NullPointerException{
- this(homeVillage, periodType, day, false);
- return;
- }
+ PeriodType periodType,
+ int day){
+ Objects.nonNull(homeVillage);
+ Objects.nonNull(periodType);
- /**
- * Periodを生成する。
- * この段階では発言データのロードは行われない。
- * @param homeVillage 所属するVillage
- * @param periodType Period種別
- * @param day Period通番
- * @param isHot Hotか否か
- * @throws java.lang.NullPointerException 引数にnullが渡された場合。
- */
- private Period(Village homeVillage,
- PeriodType periodType,
- int day,
- boolean isHot)
- throws NullPointerException{
- if( homeVillage == null
- || periodType == null ) throw new NullPointerException();
if(day < 0){
throw new IllegalArgumentException("Period day is too small !");
}
+
switch(periodType){
case PROLOGUE:
assert day == 0;
/**
* 所属する村を返す。
+ *
* @return 村
*/
public Village getVillage(){
/**
* Period種別を返す。
+ *
* @return 種別
*/
public PeriodType getType(){
/**
* Period通番を返す。
- * プロローグは常に0番。
- * n日目のゲーム進行日はn番
- * エピローグは最後のゲーム進行日+1番
+ *
+ * <p>プロローグは常に0番。
+ * n日目のゲーム進行日はn番。
+ * エピローグは最後のゲーム進行日+1番。
+ *
* @return Period通番
*/
public int getDay(){
/**
* 更新時刻の文字表記を返す。
+ *
* @return 更新時刻の文字表記
*/
public String getLimit(){
/**
* プロローグか否か判定する。
+ *
* @return プロローグならtrue
*/
public boolean isPrologue(){
/**
* エピローグか否か判定する。
+ *
* @return エピローグならtrue
*/
public boolean isEpilogue(){
/**
* 進行日か否か判定する。
+ *
* @return 進行日ならtrue
*/
public boolean isProgress(){
/**
* このPeriodにアクセスするためのクエリーを生成する。
+ *
* @return CGIに渡すクエリー
*/
public String getCGIQuery(){
/**
* Periodに含まれるTopicのリストを返す。
- * このリストは上書き操作不能。
+ *
+ * <p>このリストは上書き操作不能。
+ *
* @return Topicのリスト
*/
public List<Topic> getTopicList(){
/**
* Periodに含まれるTopicの総数を返す。
+ *
* @return Topic総数
*/
public int getTopics(){
/**
* Topicを追加する。
+ *
* @param topic Topic
* @throws java.lang.NullPointerException nullが渡された場合。
*/
/**
* Periodのキャプション文字列を返す。
- * 主な用途はタブ画面の耳のラベルなど。
+ *
+ * <p>主な用途はタブ画面の耳のラベルなど。
+ *
* @return キャプション文字列
*/
public String getCaption(){
}
/**
- * このPeriodをダウンロードしたときのログイン名を返す。
- * @return ログイン名。ログアウト中はnull。
- */
- public String getLoginName(){
- return this.loginName;
- }
-
- /**
- * ログイン名を設定する。
- * @param loginName ログイン名
- */
- public void setLoginName(String loginName){
- this.loginName = loginName;
- return;
- }
-
- /**
* 公開発言番号にマッチする発言を返す。
+ *
* @param talkNo 公開発言番号
* @return 発言。見つからなければnull
*/
}
/**
- * このPeriodの内容が全て公に開示されたものであるか判定する。
- *
- * <p>公に開示とは、非狼プレイヤーでも赤ログを閲覧できる状況を指す。
- *
- * <p>※ 2020-02の時点で、全てのPeriodは公に開示されているものとする。
- *
- * @return すべて開示されているならtrue
- */
- public boolean isFullOpen(){
- return this.isFullOpen;
- }
-
- /**
- * このPeriodの内容が全て公に開示されたものであるか設定する。
- *
- * <p>公に開示とは、非狼プレイヤーでも赤ログを閲覧できる状況を指す。
- *
- * <p>※ 2020-02の時点で、全てのPeriodは公に開示されているものとする。
- *
- * @param fullOpen すべて開示されているならtrue
- */
- public void setFullOpen(boolean fullOpen){
- this.isFullOpen = fullOpen;
- return;
- }
-
- /**
* ロード済みか否かチェックする。
+ *
* @return ロード済みならtrue
*/
public boolean hasLoaded(){
- return getTopics() > 0;
+ return ! this.topicList.isEmpty();
}
/**
public void unload(){
this.limitHour = 0;
this.limitMinute = 0;
- this.loginName = null;
- this.isFullOpen = false;
this.topicList.clear();
/**
* 襲撃メッセージの有無を判定する。
- * 決着が付くまで非狼陣営には見えない。
+ *
+ * <p>決着が付くまで非狼陣営には見えない。
* 偽装GJでは狼にも見えない。
+ *
* @return 襲撃メッセージがあればtrue
*/
public boolean hasAssaultTried(){
/**
* 処刑されたAvatarを返す。
+ *
* @return 処刑されたAvatar。突然死などなんらかの理由でいない場合はnull
*/
public Avatar getExecutedAvatar(){
/**
* 投票に参加したAvatarの集合を返す。
+ *
* @return 投票に参加したAvatarのSet
*/
public Set<Avatar> getVoterSet(){
/**
* 任意のタイプのシステムイベントを返す。
- * 複数存在する場合、返すのは最初の一つだけ。
+ *
+ * <p>複数存在する場合、返すのは最初の一つだけ。
+ *
* @param type イベントタイプ
* @return システムイベント
*/
import jp.sfjp.jindolf.data.Village;
import jp.sfjp.jindolf.net.HtmlSequence;
import jp.sfjp.jindolf.net.ServerAccess;
-import jp.sourceforge.jindolf.corelib.PeriodType;
-import jp.sourceforge.jindolf.corelib.VillageState;
/**
* 人狼各国のHTTPサーバから各村の個別の日(Period)をHTMLで取得する。
*
* <p>Periodには、プレイヤー同士の会話や
* システムが自動生成するメッセージが正しい順序で納められる。
- *
- * <p>※ 人狼BBS:G国におけるG2087村のエピローグが終了した段階で、
- * 人狼BBSは過去ログの提供しか行っていない。
- * だがこのクラスには進行中の村の各日をパースするための
- * 冗長な処理(Hot判定、fullopen判定etc.)が若干残っている。
*/
public final class PeriodLoader {
Village village = period.getVillage();
- /*
- プレイ中の村でプロローグでもエピローグでもない日は
- 灰ログetc.の非開示情報が含まれる。
- ※ 2020-02の時点で非開示情報の含まれるPeriodは存在しない。
- (常にFullOpen)
- */
- boolean isOpen = true;
- if( village.getState() == VillageState.PROGRESS
- && period.getType() == PeriodType.PROGRESS ){
- isOpen = false;
- }
- period.setFullOpen(isOpen);
-
Land land = village.getParentLand();
ServerAccess server = land.getServerAccess();