// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/core/SkipReason.java
// public enum SkipReason {
//   IDLE,
//   OFFLINE,
//   BANNED_MAP
// }
// 
// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/osu/OsuUser.java
// @PersistenceCapable(detachable = "true")
// @Getter
// @ToString
// public class OsuUser {
//   @PrimaryKey
//   @UserId
//   @Getter(onMethod = @__(@UserId))
//   private int userId;
// 
//   @Index
//   private String userName;
// 
//   private long downloaded;
// 
//   @Setter
//   private Privilege privilege = Privilege.PLAYER;
// 
//   @Setter
//   @Column(defaultValue = "true")
//   private boolean allowsNotifications = true;
//   
//   @Setter
//   @Column(defaultValue = "true")
//   @Index
//   private boolean allowsSpectating = true;
//   
//   @Setter(onParam = @__(@GameMode))
//   @Getter(onMethod = @__(@GameMode))
//   @Column(defaultValue = "0")
//   @GameMode
//   private int gameMode = 0;
// 
//   @Setter
//   @Column(defaultValue = "-1")
//   private long timeOutUntil = -1;
// 
//   /**
//    * Creates a new user object copying all relevant data from the api user object.
//    * 
//    * @param user downloaded data.
//    * @param downloaded current time in millis.
//    */
//   public OsuUser(OsuApiUser user, long downloaded) {
//     this.userId = user.getUserId();
//     update(user, downloaded);
//   }
// 
//   /**
//    * updates this object with the downloaded data.
//    * 
//    * @param user downloaded data
//    * @param downloaded current time
//    */
//   public void update(OsuApiUser user, long downloaded) {
//     this.setUserName(user.getUserName());
//     this.setDownloaded(downloaded);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (obj instanceof OsuUser) {
//       return ((OsuUser) obj).userId == userId;
//     }
//     return false;
//   }
// 
//   @Override
//   public int hashCode() {
//     return userId;
//   }
// 
//   void setDownloaded(long downloaded) {
//     this.downloaded = downloaded;
//   }
// 
//   void setUserName(String userName) {
//     this.userName = userName;
//   }
// }
// 
// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/twitchapi/TwitchApi.java
// @PassAndReturnNonnull
// public interface TwitchApi {
//   /**
//    * Gets a list of moderators currently in a channel.
//    * 
//    * @return The list of moderator usernames in lowercase
//    */
//   List<String> getOnlineMods();
// 
//   /**
//    * Determines whether a given user is a moderator of a channel.
//    * 
//    * @param username The username of the user
//    * @return True if the user is a moderator
//    */
//   boolean isModerator(String username);
// 
//   /**
//    * Retrieves the user from the API.
//    * @param username username (all lower case).
//    * @param maxAge if > 0, cached data up to this age can be returned.
//    * @param returnCachedOnIoException if true, a cached data is used if a server exception
//    *        occurrs during an update from the api
//    * @return the user object.
//    */
//   TwitchApiUser getUser(PersistenceManager pm, String username, long maxAge,
//       boolean returnCachedOnIoException);
//   
//   /**
//    * Retrieves the link to the past broadcast that a play occurred in at the exact time when the
//    * play started.
//    * 
//    * @param play any play.
//    * @return the full URL. if no matching past broadcast can be found, null.
//    */
//   @CheckForNull
//   URL getReplayLink(QueuedPlayer play) throws IOException;
// }


import static me.reddev.osucelebrity.twitch.QTwitchUser.twitchUser;
import com.querydsl.jdo.JDOQuery;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.reddev.osucelebrity.TwitchResponses;
import me.reddev.osucelebrity.core.SkipReason;
import me.reddev.osucelebrity.osu.OsuUser;
import me.reddev.osucelebrity.osuapi.OsuApi;
import me.reddev.osucelebrity.twitchapi.TwitchApi;
import me.reddev.osucelebrity.twitchapi.TwitchApiSettings;
import me.reddev.osucelebrity.twitchapi.TwitchApiUser;
import java.io.IOException;
import javax.inject.Inject;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
package me.reddev.osucelebrity.twitch;





@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class TwitchImpl implements Twitch {
  final OsuApi osuApi;
  final TwitchIrcSettings ircSettings;
  final TwitchApiSettings apiSettings;
  final PersistenceManagerFactory pmf;
  final TwitchIrcBot bot;
  final TwitchApi api;

  @Override
  public void whisperUser(String nick, String message) {
    // TODO Auto-generated method stub

  }

  @Override
// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/core/SkipReason.java
// public enum SkipReason {
//   IDLE,
//   OFFLINE,
//   BANNED_MAP
// }
// 
// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/osu/OsuUser.java
// @PersistenceCapable(detachable = "true")
// @Getter
// @ToString
// public class OsuUser {
//   @PrimaryKey
//   @UserId
//   @Getter(onMethod = @__(@UserId))
//   private int userId;
// 
//   @Index
//   private String userName;
// 
//   private long downloaded;
// 
//   @Setter
//   private Privilege privilege = Privilege.PLAYER;
// 
//   @Setter
//   @Column(defaultValue = "true")
//   private boolean allowsNotifications = true;
//   
//   @Setter
//   @Column(defaultValue = "true")
//   @Index
//   private boolean allowsSpectating = true;
//   
//   @Setter(onParam = @__(@GameMode))
//   @Getter(onMethod = @__(@GameMode))
//   @Column(defaultValue = "0")
//   @GameMode
//   private int gameMode = 0;
// 
//   @Setter
//   @Column(defaultValue = "-1")
//   private long timeOutUntil = -1;
// 
//   /**
//    * Creates a new user object copying all relevant data from the api user object.
//    * 
//    * @param user downloaded data.
//    * @param downloaded current time in millis.
//    */
//   public OsuUser(OsuApiUser user, long downloaded) {
//     this.userId = user.getUserId();
//     update(user, downloaded);
//   }
// 
//   /**
//    * updates this object with the downloaded data.
//    * 
//    * @param user downloaded data
//    * @param downloaded current time
//    */
//   public void update(OsuApiUser user, long downloaded) {
//     this.setUserName(user.getUserName());
//     this.setDownloaded(downloaded);
//   }
// 
//   @Override
//   public boolean equals(Object obj) {
//     if (obj instanceof OsuUser) {
//       return ((OsuUser) obj).userId == userId;
//     }
//     return false;
//   }
// 
//   @Override
//   public int hashCode() {
//     return userId;
//   }
// 
//   void setDownloaded(long downloaded) {
//     this.downloaded = downloaded;
//   }
// 
//   void setUserName(String userName) {
//     this.userName = userName;
//   }
// }
// 
// Path: osuCelebrity-model/src/main/java/me/reddev/osucelebrity/twitchapi/TwitchApi.java
// @PassAndReturnNonnull
// public interface TwitchApi {
//   /**
//    * Gets a list of moderators currently in a channel.
//    * 
//    * @return The list of moderator usernames in lowercase
//    */
//   List<String> getOnlineMods();
// 
//   /**
//    * Determines whether a given user is a moderator of a channel.
//    * 
//    * @param username The username of the user
//    * @return True if the user is a moderator
//    */
//   boolean isModerator(String username);
// 
//   /**
//    * Retrieves the user from the API.
//    * @param username username (all lower case).
//    * @param maxAge if > 0, cached data up to this age can be returned.
//    * @param returnCachedOnIoException if true, a cached data is used if a server exception
//    *        occurrs during an update from the api
//    * @return the user object.
//    */
//   TwitchApiUser getUser(PersistenceManager pm, String username, long maxAge,
//       boolean returnCachedOnIoException);
//   
//   /**
//    * Retrieves the link to the past broadcast that a play occurred in at the exact time when the
//    * play started.
//    * 
//    * @param play any play.
//    * @return the full URL. if no matching past broadcast can be found, null.
//    */
//   @CheckForNull
//   URL getReplayLink(QueuedPlayer play) throws IOException;
// }


// Path: osuCelebrity-twitch/src/main/java/me/reddev/osucelebrity/twitch/TwitchImpl.java
import static me.reddev.osucelebrity.twitch.QTwitchUser.twitchUser;
import com.querydsl.jdo.JDOQuery;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.reddev.osucelebrity.TwitchResponses;
import me.reddev.osucelebrity.core.SkipReason;
import me.reddev.osucelebrity.osu.OsuUser;
import me.reddev.osucelebrity.osuapi.OsuApi;
import me.reddev.osucelebrity.twitchapi.TwitchApi;
import me.reddev.osucelebrity.twitchapi.TwitchApiSettings;
import me.reddev.osucelebrity.twitchapi.TwitchApiUser;
import java.io.IOException;
import javax.inject.Inject;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;

package me.reddev.osucelebrity.twitch;





@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class TwitchImpl implements Twitch {
  final OsuApi osuApi;
  final TwitchIrcSettings ircSettings;
  final TwitchApiSettings apiSettings;
  final PersistenceManagerFactory pmf;
  final TwitchIrcBot bot;
  final TwitchApi api;

  @Override
  public void whisperUser(String nick, String message) {
    // TODO Auto-generated method stub

  }

  @Override
  public void announceAdvance(SkipReason reason, OsuUser oldPlayer, OsuUser newPlayer) {