// Path: src/main/java/com/gikk/twirk/types/AbstractEmoteMessage.java
// public interface AbstractEmoteMessage extends AbstractType{
// 
//     /**Checks whether this message contains emotes or not
//      *
//      * @return {@code true} if the message contains emotes
//      */
//     public boolean hasEmotes();
// 
// 	/**Fetches a list of all all emotes in this message. Each emote is encapsulated in a {@link Emote}.
// 	 * The list might be empty, if the message contained no emotes.
// 	 *
// 	 * @return List of emotes (might be empty)
// 	 */
// 	public List<Emote> getEmotes();
// 
//     /**Fetches the timestamp of when the message reached the Twitch message server.
//      *
//      * @return UNIX timestap, or -1 (if none was present)
//      */
//     public long getSentTimestamp();
// 
//     /**Fetches the chat room's unique ID.
//      *
//      * @return the room ID.
//      */
//     public long getRoomID();
// 
//     /**Fetches the message's unique ID.
//      *
//      * @return the message ID.
//      */
//     public String getMessageID();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Raid.java
// public interface Raid {
// 
//     /**Fetches the display name of the user whom initiated the raid.
//      *
//      * @return the display name of the raid initiator
//      */
//     public String getSourceDisplayName();
// 
//     /**Fetches the login name of the user whom initiated the raid. This will
//      * also give you the name of the channel which the raid originated from.
//      *
//      * @return the login name of the raid initiator
//      */
//     public String getSourceLoginName();
// 
// 
//     /**Fetches the number of users participating in the raid.
//      *
//      * @return number of raiders
//      */
//     public int getRaidCount();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Ritual.java
// public interface Ritual {
//     /**Fetches the name of the Ritual
//      *
//      * @return the ritual name
//      */
//     public String getRitualName();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Subscription.java
// public interface Subscription {
//     public SubscriptionPlan getSubscriptionPlan();
// 
//     /**Get the number of month's the subscription's been active. New subscriptions
//      * return 1, whilst re-subscriptions tells which month was just activated.
//      *
//      * @return number of months
//      */
//     public int getMonths();
// 
//     /**Get the number of month's the subscription's been active consecutive.
//      *
//      * @return number of months
//      */
//     public int getStreak();
// 
//     /** Returns if user decide to share the streak, this decide if the value of {@code getStreak} its zero or another.
//      *
//      * @return {@code true} if user share the streak
//      */
//     public boolean isSharedStreak();
// 
//     /**Returns the name of the purchased subscription plan.  This may be a
//      * default name or one created by the channel owner.
//      *
//      * @return display name of the subscription plan
//      */
//     public String getSubscriptionPlanName();
// 
//     /**Returns whether this was a new sub or a re-sub.
//      *
//      * @return {@code true} if this was a re-subscription
//      */
//     public boolean isResub();
// 
//     /**Tells whether this is a subscription gift or not.
//      *
//      * @return {@code true} if this was a gift
//      */
//     public boolean isGift();
// 
//     /**Retrieves the SubscriptionGift item, which holds information about the
//      * gift and the recipiant of the gift. The Optional object wraps the
//      * SubscriptionGift object (as an alternative to returning {@code null}).
//      *
//      * @return the subscription gift, wrapped in a {@link Optional}
//      */
//     public Optional<SubscriptionGift> getSubscriptionGift();
// }


import com.gikk.twirk.types.AbstractEmoteMessage;
import com.gikk.twirk.types.usernotice.subtype.Raid;
import com.gikk.twirk.types.usernotice.subtype.Ritual;
import com.gikk.twirk.types.usernotice.subtype.Subscription;
import java.util.Optional;
package com.gikk.twirk.types.usernotice;


/**Class for representing the Usernotice event. Usernotices can fire under 4
 * different conditions:
 * <ul>
 * <li> New subscription & Resubscription
 * <li> Raid
 * <li> Ritual
 * </ul>
 * Since this class might contain 3 different event types, the getSubscription(),
 * getRaid() and getRitual methods all return {@link Optional} objects.
 *
 * @author Gikkman
 */
public interface Usernotice extends AbstractEmoteMessage {

    /**Retrieves the message, as input by the user. This message might contain
     * emotes (see {@link #hasEmotes()} and {@link #getEmotes()}.
	 * It might also be empty, in which case, the message is {@code ""}
	 *
	 * @return The message. Might be {@code ""}
	 */
	public String getMessage();

	/**The system message contains the text which'll be printed in the Twitch
     * Chat on Twitch's side. It might look like this: <br>
	 * {@code system-msg=TWITCH_UserName\shas\ssubscribed\sfor\s6\smonths!;}.
     * <p>
	 * This is basically the message printed in chat to tell other viewers
     * what just occred (a raid, a subscription and so on).
     * <p>
	 * This method returns the system message like it looks from server side.
     * It will, however, replace all {@code \s} with spaces.
	 *
	 * @return The system message
	 */
// Path: src/main/java/com/gikk/twirk/types/AbstractEmoteMessage.java
// public interface AbstractEmoteMessage extends AbstractType{
// 
//     /**Checks whether this message contains emotes or not
//      *
//      * @return {@code true} if the message contains emotes
//      */
//     public boolean hasEmotes();
// 
// 	/**Fetches a list of all all emotes in this message. Each emote is encapsulated in a {@link Emote}.
// 	 * The list might be empty, if the message contained no emotes.
// 	 *
// 	 * @return List of emotes (might be empty)
// 	 */
// 	public List<Emote> getEmotes();
// 
//     /**Fetches the timestamp of when the message reached the Twitch message server.
//      *
//      * @return UNIX timestap, or -1 (if none was present)
//      */
//     public long getSentTimestamp();
// 
//     /**Fetches the chat room's unique ID.
//      *
//      * @return the room ID.
//      */
//     public long getRoomID();
// 
//     /**Fetches the message's unique ID.
//      *
//      * @return the message ID.
//      */
//     public String getMessageID();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Raid.java
// public interface Raid {
// 
//     /**Fetches the display name of the user whom initiated the raid.
//      *
//      * @return the display name of the raid initiator
//      */
//     public String getSourceDisplayName();
// 
//     /**Fetches the login name of the user whom initiated the raid. This will
//      * also give you the name of the channel which the raid originated from.
//      *
//      * @return the login name of the raid initiator
//      */
//     public String getSourceLoginName();
// 
// 
//     /**Fetches the number of users participating in the raid.
//      *
//      * @return number of raiders
//      */
//     public int getRaidCount();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Ritual.java
// public interface Ritual {
//     /**Fetches the name of the Ritual
//      *
//      * @return the ritual name
//      */
//     public String getRitualName();
// }
// 
// Path: src/main/java/com/gikk/twirk/types/usernotice/subtype/Subscription.java
// public interface Subscription {
//     public SubscriptionPlan getSubscriptionPlan();
// 
//     /**Get the number of month's the subscription's been active. New subscriptions
//      * return 1, whilst re-subscriptions tells which month was just activated.
//      *
//      * @return number of months
//      */
//     public int getMonths();
// 
//     /**Get the number of month's the subscription's been active consecutive.
//      *
//      * @return number of months
//      */
//     public int getStreak();
// 
//     /** Returns if user decide to share the streak, this decide if the value of {@code getStreak} its zero or another.
//      *
//      * @return {@code true} if user share the streak
//      */
//     public boolean isSharedStreak();
// 
//     /**Returns the name of the purchased subscription plan.  This may be a
//      * default name or one created by the channel owner.
//      *
//      * @return display name of the subscription plan
//      */
//     public String getSubscriptionPlanName();
// 
//     /**Returns whether this was a new sub or a re-sub.
//      *
//      * @return {@code true} if this was a re-subscription
//      */
//     public boolean isResub();
// 
//     /**Tells whether this is a subscription gift or not.
//      *
//      * @return {@code true} if this was a gift
//      */
//     public boolean isGift();
// 
//     /**Retrieves the SubscriptionGift item, which holds information about the
//      * gift and the recipiant of the gift. The Optional object wraps the
//      * SubscriptionGift object (as an alternative to returning {@code null}).
//      *
//      * @return the subscription gift, wrapped in a {@link Optional}
//      */
//     public Optional<SubscriptionGift> getSubscriptionGift();
// }


// Path: src/main/java/com/gikk/twirk/types/usernotice/Usernotice.java
import com.gikk.twirk.types.AbstractEmoteMessage;
import com.gikk.twirk.types.usernotice.subtype.Raid;
import com.gikk.twirk.types.usernotice.subtype.Ritual;
import com.gikk.twirk.types.usernotice.subtype.Subscription;
import java.util.Optional;

package com.gikk.twirk.types.usernotice;


/**Class for representing the Usernotice event. Usernotices can fire under 4
 * different conditions:
 * <ul>
 * <li> New subscription & Resubscription
 * <li> Raid
 * <li> Ritual
 * </ul>
 * Since this class might contain 3 different event types, the getSubscription(),
 * getRaid() and getRitual methods all return {@link Optional} objects.
 *
 * @author Gikkman
 */
public interface Usernotice extends AbstractEmoteMessage {

    /**Retrieves the message, as input by the user. This message might contain
     * emotes (see {@link #hasEmotes()} and {@link #getEmotes()}.
	 * It might also be empty, in which case, the message is {@code ""}
	 *
	 * @return The message. Might be {@code ""}
	 */
	public String getMessage();

	/**The system message contains the text which'll be printed in the Twitch
     * Chat on Twitch's side. It might look like this: <br>
	 * {@code system-msg=TWITCH_UserName\shas\ssubscribed\sfor\s6\smonths!;}.
     * <p>
	 * This is basically the message printed in chat to tell other viewers
     * what just occred (a raid, a subscription and so on).
     * <p>
	 * This method returns the system message like it looks from server side.
     * It will, however, replace all {@code \s} with spaces.
	 *
	 * @return The system message
	 */
	public String getSystemMessage();