Skip to content

Commit

Permalink
Merge pull request #2110 from GiganticMinecraft/develop
Browse files Browse the repository at this point in the history
バージョン 82 リリース
  • Loading branch information
rito528 authored Jun 17, 2023
2 parents ecaaa7d + d55efab commit 8634241
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 45 deletions.
41 changes: 32 additions & 9 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 開発体制

## 開発を始めるために必要なもの
- [Intellij IDEA](https://www.jetbrains.com/idea/) などの統合開発環境
- [AdoptOpenJDK 1.8](https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot)
- [IntelliJ IDEA](https://www.jetbrains.com/idea/) などの統合開発環境
- [JDK 8](https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot)
- [sbt 1.6](https://www.scala-sbt.org/1.x/docs/Setup.html)
- [Scala 2.13](https://www.scala-lang.org/download/)
- Spigot 1.12.2
Expand All @@ -16,7 +16,7 @@
[AdoptOpenJDK 1.8](https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot) のインストールを推奨します。

#### 統合開発環境
次に、[Intellij IDEA](https://www.jetbrains.com/idea/)などの統合開発環境を導入します。
次に、[IntelliJ IDEA](https://www.jetbrains.com/idea/)などの統合開発環境を導入します。

有料版 **Ultimate Edition** と機能が制限された無料版 **Community Edition** が2つありますが、SeichiAssist を開発する上では無料版で十分です。

Expand All @@ -26,7 +26,7 @@
>
> 学生の場合は、[学生ライセンス](https://www.jetbrains.com/community/education/#students)を申請することで Ultimate Edition を無料で利用できます。
##### Intellij
##### IntelliJ
* インストールする時、Gitプラグインを有効にします。
* Scala用の[プラグイン](https://plugins.jetbrains.com/plugin/1347-scala)を導入してください。

Expand Down Expand Up @@ -212,11 +212,34 @@ DockerマシンのIPアドレス(Linux等なら`localhost`)を`DOCKER_IP`とし
その後、自分の手元から自分のGitHubアカウントへ内容を反映します。

#### Pull Requestの作成
次に、自分のGitHubアカウントにあるSeichiAssistを開いて、変更を依頼する手続き (Pull Request) の準備画面へ移動します。
画面が切り替わります。右上のCreate pull requestと書かれたボタンを押してください。
そうすると、高さが狭い場所と広い場所が表示されます。
狭い場所には、変更の概要を50文字以内で簡単に書いてください。 (TODO: コンベンショナルコミット)
広い場所には、書くべきだと思ったことを書いてください。詳しすぎるということはありません。
次に、自分のGitHubアカウントにあるSeichiAssistを開いて、変更を依頼する手続き (Pull Request) の準備画面へ移動し、右上のCreate pull requestと書かれたボタンを押すとこのような入力欄が表示されます。

```md
close #

----

### このPRの変更点と理由:

### 補足情報:
```
(一部省略)

書くべき主な内容の説明はコメントに記載されています。

どれも必須ではありませんが、メンテナたちにどんな変更をしたのか正確に伝えるためにもなるべく書くことを心かけるといいでしょう。

- **`close #`**
- プルリクエストと対象のIssueを紐付ける事ができます。
- そのプルリクエストに関係し、なおかつマージ後に自動でクローズしたいIssueの番号を指定してください。
- 複数のIssueを紐付ける場合は `close #1, close #2` と繰り返し指定します。
- 詳細: [キーワードを使用してPull RequestをIssueにリンクする - GitHub Docs](https://docs.github.com/ja/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- **`このPRの変更点と理由:`**
- このプルリクエストで行った変更点とその理由を記述します。
- 自明な場合は書く必要はありませんが、なるべく書くようにします。
- **`補足情報:`**
- その他、メンテナたちに伝えたい事があれば自由に書いてください。

一通り書き終わったら、長い場所の右下にある「Create pull request」と書かれたボタンを押してください。

### コードレビューを待つ
Expand Down
4 changes: 2 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import java.io._
ThisBuild / scalaVersion := "2.13.11"
// ThisBuild / version はGitHub Actionsによって取得/自動更新される。
// 次の行は ThisBuild / version := "(\d*)" の形式でなければならない。
ThisBuild / version := "81"
ThisBuild / version := "82"
ThisBuild / organization := "click.seichi"
ThisBuild / description := "ギガンティック☆整地鯖の独自要素を司るプラグイン"

Expand Down Expand Up @@ -118,7 +118,7 @@ val dependenciesToEmbed = Seq(
"com.github.KisaragiEffective" % "ajd4jp-mirror" % "8.0.2.2021",

// Sentry
"io.sentry" % "sentry" % "6.22.0"
"io.sentry" % "sentry" % "6.23.0"
)

// endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,12 +383,7 @@ object VoteMenu extends Menu {
s"$RESET${DARK_GRAY}召喚されたらラッキーだよ!"
)
val topFourRankingLore =
List(
topFourRanking.headOption,
topFourRanking.lift(1),
topFourRanking.lift(2),
topFourRanking.lift(3)
).flatMap(_.flatten).flatMap { rankData =>
topFourRanking.flatMap { rankData =>
List(
s"${GRAY}たくさんくれたニンゲン第${rankData.rank}位!",
s"${GRAY}なまえ:${rankData.playerName} りんご:${rankData.consumed.amount}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ class BukkitMineStackObjectList[F[_]: Sync](
)
),
MineStackObjectWithColorVariants(
MineStackObjectByMaterial(BUILDING, "wool_0", "羊毛", Material.WOOL, 0),
MineStackObjectByMaterial(BUILDING, "wool_0", "白色の羊毛", Material.WOOL, 0),
List(
MineStackObjectByMaterial(BUILDING, "wool_1", "橙色の羊毛", Material.WOOL, 1),
MineStackObjectByMaterial(BUILDING, "wool_2", "赤紫色の羊毛", Material.WOOL, 2),
Expand All @@ -442,7 +442,7 @@ class BukkitMineStackObjectList[F[_]: Sync](
)
),
MineStackObjectWithColorVariants(
MineStackObjectByMaterial(BUILDING, "carpet_0", "カーペット", Material.CARPET, 0),
MineStackObjectByMaterial(BUILDING, "carpet_0", "白色のカーペット", Material.CARPET, 0),
List(
MineStackObjectByMaterial(BUILDING, "carpet_1", "橙色のカーペット", Material.CARPET, 1),
MineStackObjectByMaterial(BUILDING, "carpet_2", "赤紫色のカーペット", Material.CARPET, 2),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import com.github.unchama.seichiassist.subsystems.sharedinventory.SharedInventor
import com.github.unchama.seichiassist.subsystems.sharedinventory.domain.SharedFlag
import com.github.unchama.seichiassist.subsystems.sharedinventory.domain.bukkit.InventoryContents
import com.github.unchama.seichiassist.util.InventoryOperations
import com.github.unchama.targetedeffect.TargetedEffect.emptyEffect
import com.github.unchama.targetedeffect.commandsender.MessageEffect
import com.github.unchama.targetedeffect.player.CommandEffect
import com.github.unchama.targetedeffect.{SequentialEffect, TargetedEffect}
Expand All @@ -29,13 +28,13 @@ class ShareInventoryCommand[F[_]: ConcurrentEffect](
val sender = context.sender
for {
sharedFlag <- sharedInventoryAPI.sharedFlag(sender).toIO
_ <-
eff <-
if (sharedFlag == SharedFlag.Sharing) {
withdrawFromSharedInventory(sender)
} else {
depositToSharedInventory(sender)
}
} yield emptyEffect
} yield eff
}
.build()
.asNonBlockingTabExecutor()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ trait FairyReadAPI[F[_], G[_], Player] {
/**
* @return 妖精に食べさせたりんごの量の上位`top`件を返す作用
*/
def rankingByMostConsumedApple(top: Int): F[Vector[Option[AppleConsumeAmountRank]]]
def rankingByMostConsumedApple(top: Int): F[Vector[AppleConsumeAmountRank]]

/**
* @return 妖精が食べたりんごの合計数を返す作用
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ object System {

override def rankingByMostConsumedApple(
top: Int
): IO[Vector[Option[AppleConsumeAmountRank]]] =
): IO[Vector[AppleConsumeAmountRank]] =
persistence.fetchMostConsumedApplePlayersByFairy(top)

override def totalConsumedApple: IO[AppleAmount] =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class BukkitFairySpeech[F[_]: Sync: JavaTime](
FairyMessageTable.manaFullMessages
case FairyManaRecoveryState.RecoveredWithApple =>
FairyMessageTable.consumed
case FairyManaRecoveryState.RecoverWithoutAppleButLessThanAApple =>
FairyMessageTable.consumed
case FairyManaRecoveryState.RecoveredWithoutApple =>
FairyMessageTable.notConsumed
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,17 @@ class BukkitRecoveryMana[F[_]: ConcurrentEffect: JavaTime, G[_]: ContextCoercion
defaultRecoveryMana.recoveryMana * 0.7 + bonusRecoveryAmount
)

manaRecoveryState <- Sync[F].delay {
// NOTE: recoveryManaAmountが300を下回ると、がちゃりんごを一つも消費しないが、
// りんごを消費できなかったときと同じ処理を行うと仕様として紛らわしいので、
// 回復量が300未満だった場合はりんごを消費して回復したことにする
if (appleConsumeAmount == 0 && recoveryManaAmount > 300)
FairyManaRecoveryState.RecoverWithoutAppleButLessThanAApple
else if (appleConsumeAmount == 0)
FairyManaRecoveryState.RecoveredWithoutApple
else FairyManaRecoveryState.RecoveredWithApple
}

_ <- {
fairyPersistence.increaseConsumedAppleAmountByFairy(
uuid,
Expand All @@ -99,22 +110,24 @@ class BukkitRecoveryMana[F[_]: ConcurrentEffect: JavaTime, G[_]: ContextCoercion
ContextCoercion(
manaApi.manaAmount(player).restoreAbsolute(ManaAmount(recoveryManaAmount))
) >>
fairySpeech.speechRandomly(
player,
if (appleConsumeAmount == 0)
FairyManaRecoveryState.RecoveredWithoutApple
else FairyManaRecoveryState.RecoveredWithApple
) >>
fairySpeech.speechRandomly(player, manaRecoveryState) >>
mineStackAPI
.mineStackRepository
.subtractStackedAmountOf(player, gachaRingoObject.get, appleConsumeAmount) >>
SequentialEffect(
MessageEffectF(
s"$RESET$YELLOW${BOLD}マナ妖精が${Math.floor(recoveryManaAmount)}マナを回復してくれました"
),
if (appleConsumeAmount != 0)
MessageEffectF(s"$RESET$YELLOW${BOLD}あっ!${appleConsumeAmount}個のがちゃりんごが食べられてる!")
else MessageEffectF(s"$RESET$YELLOW${BOLD}あなたは妖精にりんごを渡しませんでした。")
manaRecoveryState match {
case FairyManaRecoveryState.RecoverWithoutAppleButLessThanAApple =>
MessageEffectF(
s"$RESET$YELLOW${BOLD}回復量ががちゃりんご1つ分に満たなかったため、あなたは妖精にりんごを渡しませんでした。"
)
case FairyManaRecoveryState.RecoveredWithApple =>
MessageEffectF(s"$RESET$YELLOW${BOLD}あっ!${appleConsumeAmount}個のがちゃりんごが食べられてる!")
case _ =>
MessageEffectF(s"$RESET$YELLOW${BOLD}あなたは妖精にりんごを渡しませんでした。")
}
).apply(player)
}.whenA(isFairyUsing && isRecoverTiming && !nonRecoveredManaAmount.isFull)
finishUse <- JavaTime[F]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ trait FairyPersistence[F[_]] {
* @param top 最上位から何番目まで取得するか件数を指定する。0以下であってはならない。
* @return 指定した件数が要素数となり、その並びが消費量の降順になっているような順序つきのコレクションを返す作用。
*/
def fetchMostConsumedApplePlayersByFairy(top: Int): F[Vector[Option[AppleConsumeAmountRank]]]
def fetchMostConsumedApplePlayersByFairy(top: Int): F[Vector[AppleConsumeAmountRank]]

/**
* @return 妖精が今まで食べたりんごの合計数を返す作用
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ object FairyManaRecoveryState {
*/
case object RecoveredWithoutApple extends FairyManaRecoveryState

/**
* マナを回復したが、回復量がりんご一つ分に満たなかったため、りんごを消費しなかった
*/
case object RecoverWithoutAppleButLessThanAApple extends FairyManaRecoveryState

/**
* りんごを消費してマナを回復した
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,12 @@ class JdbcFairyPersistence[F[_]: Sync] extends FairyPersistence[F] {
): F[Option[AppleConsumeAmountRank]] =
Sync[F].delay {
DB.readOnly { implicit session =>
sql"""SELECT vote_fairy.uuid AS uuid,name,given_apple_amount,COUNT(*) AS rank
sql"""SELECT vote_fairy.uuid AS uuid, name, given_apple_amount,
| RANK() OVER(ORDER BY given_apple_amount DESC) AS rank
| FROM vote_fairy
| INNER JOIN playerdata
| ON (playerdata.uuid = vote_fairy.uuid)
| ORDER BY rank DESC;"""
| ORDER BY rank"""
.stripMargin
.map(rs =>
rs.string("uuid") -> AppleConsumeAmountRank(
Expand All @@ -183,19 +184,20 @@ class JdbcFairyPersistence[F[_]: Sync] extends FairyPersistence[F] {

override def fetchMostConsumedApplePlayersByFairy(
top: Int
): F[Vector[Option[AppleConsumeAmountRank]]] =
): F[Vector[AppleConsumeAmountRank]] =
Sync[F].delay {
DB.readOnly { implicit session =>
sql"""SELECT name,given_apple_amount,COUNT(*) AS rank FROM vote_fairy
| INNER JOIN playerdata ON (vote_fairy.uuid = playerdata.uuid)
| ORDER BY rank DESC LIMIT $top;"""
sql"""SELECT name, given_apple_amount, RANK() OVER(ORDER BY given_apple_amount DESC) AS rank FROM vote_fairy
| INNER JOIN playerdata ON (vote_fairy.uuid = playerdata.uuid)
| ORDER BY rank
| LIMIT $top;"""
.stripMargin
.map { rs =>
for {
name <- rs.stringOpt("name")
rank <- rs.intOpt("rank")
givenAppleAmount <- rs.intOpt("given_apple_amount")
} yield AppleConsumeAmountRank(name, rank, AppleAmount(givenAppleAmount))
val name = rs.string("name")
val rank = rs.int("rank")
val givenAppleAmount = rs.int("given_apple_amount")

AppleConsumeAmountRank(name, rank, AppleAmount(givenAppleAmount))
}
.toList()
.apply()
Expand Down

0 comments on commit 8634241

Please sign in to comment.