Skip to content

Commit

Permalink
Override newer commands if they conflict in purpose
Browse files Browse the repository at this point in the history
  • Loading branch information
ScoreUnder committed Mar 6, 2021
1 parent 8f69cda commit 37b8d2a
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,16 @@ class EventWaiter extends EventListener {
type Instant = Long // nanoTime
type EventHandler = PartialFunction[GenericEvent, Unit]

case class ExpiringEvent(expiry: Instant = System.nanoTime() + 10.minutes.toNanos, handler: EventHandler) {
case class ExpiringEvent(expiry: Instant = System.nanoTime() + 10.minutes.toNanos, identifier: AnyRef, handler: EventHandler) {
def expired: Boolean = expiry <= System.nanoTime()
}

private[this] val queuedEvents = mutable.ArrayBuffer.empty[ExpiringEvent]

def queue(handler: EventHandler): Unit = {
def queue(identifier: AnyRef)(handler: EventHandler): Unit = {
queuedEvents.synchronized {
queuedEvents += ExpiringEvent(handler = handler)
queuedEvents.filterInPlace(_.identifier != identifier)
queuedEvents += ExpiringEvent(identifier = identifier, handler = handler)
}
}

Expand All @@ -42,7 +43,7 @@ class EventWaiter extends EventListener {
activeHandlers
}

for (ev@ExpiringEvent(_, handler) <- activeHandlers if !ev.expired) {
for (ev@ExpiringEvent(_, _, handler) <- activeHandlers if !ev.expired) {
Future {
handler(event)
}.failed.foreach(APIHelper.failure("processing delayed event"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class PrivateVoiceChats(
def valid: Boolean = System.currentTimeMillis() < expiry
}

private case class VoiceMove(id: ID[Member], guild: ID[Guild])

private trait MyReplyingCommand extends ReplyingCommand {
override implicit def messageOwnership: MessageOwnership = PrivateVoiceChats.this.messageOwnership

Expand Down Expand Up @@ -320,18 +322,19 @@ class PrivateVoiceChats(
})).toMessage

private def sendErrorOrRetry(replyTo: Message)(handler: => Future[Message])(ex: Throwable): Future[Message] = {
val channel = Option(replyTo.getMember).flatMap(x => Option(x.getVoiceState.getChannel))
val member = replyTo.getMember
val channel = Option(member.getVoiceState.getChannel)
ex match {
case _: IllegalStateException if channel.isEmpty => waitForVoiceJoin(replyTo, handler)
case _: IllegalStateException if channel.isEmpty => waitForVoiceJoin(replyTo, VoiceMove(member.id, member.getGuild.id), handler)
case _ => Future.successful(getChannelMoveError(ex))
}
}

private def waitForVoiceJoin[T](replyTo: Message, handler: => Future[T]) = {
private def waitForVoiceJoin[T](replyTo: Message, identifier: AnyRef, handler: => Future[T]) = {
val member = replyTo.getMember
replyTo ! BotMessages.plain("Please join voice chat. Your command has been remembered until then.")
val promise = Promise[T]()
eventWaiter.queue {
eventWaiter.queue(identifier) {
case GuildVoiceUpdate(`member`, None, Some(_)) => promise.completeWith(handler)
}
promise.future
Expand Down Expand Up @@ -386,7 +389,7 @@ class PrivateVoiceChats(
.pipe(x => eitherToFutureMessage(x))

case None =>
waitForVoiceJoin(message, retryingParseAndCreateChannel(member))
waitForVoiceJoin(message, VoiceMove(member.id, member.getGuild.id), retryingParseAndCreateChannel(member))
}

CommandHelper(message).member
Expand Down

0 comments on commit 37b8d2a

Please sign in to comment.