diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java index b361a1c3..010cd15d 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/Room.java @@ -175,7 +175,30 @@ public class Room implements Comparable, ISerialize, Runnable { private volatile boolean muted; private RoomSpecialTypes roomSpecialTypes; private TraxManager traxManager; - + + private String youtubeCurrentVideo = ""; + private String youtubeSenderName = ""; + private final java.util.List youtubePlaylist = new java.util.concurrent.CopyOnWriteArrayList<>(); + private final java.util.Set youtubeWatchers = java.util.concurrent.ConcurrentHashMap.newKeySet(); + + public String getYoutubeCurrentVideo() { return this.youtubeCurrentVideo; } + public String getYoutubeSenderName() { return this.youtubeSenderName; } + public java.util.List getYoutubePlaylist() { return this.youtubePlaylist; } + public java.util.Set getYoutubeWatchers() { return this.youtubeWatchers; } + + public void setYoutubeVideo(String videoId, String senderName, java.util.List playlist) { + this.youtubeCurrentVideo = videoId; + this.youtubeSenderName = senderName; + this.youtubePlaylist.clear(); + if (playlist != null) this.youtubePlaylist.addAll(playlist); + } + + public void clearYoutubeVideo() { + this.youtubeCurrentVideo = ""; + this.youtubeSenderName = ""; + this.youtubePlaylist.clear(); + } + public final THashMap cache; public Room(ResultSet set) throws SQLException { diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java index 2c92c4c3..527cb759 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomManager.java @@ -987,6 +987,17 @@ public class RoomManager { } } + if (!room.getYoutubeCurrentVideo().isEmpty()) { + habbo.getClient().sendResponse(new com.eu.habbo.messages.outgoing.rooms.youtube.YouTubeRoomBroadcastComposer( + room.getYoutubeCurrentVideo(), + room.getYoutubeSenderName(), + room.getYoutubePlaylist()).compose()); + } + if (!room.getYoutubeWatchers().isEmpty()) { + habbo.getClient().sendResponse(new com.eu.habbo.messages.outgoing.rooms.youtube.YouTubeRoomWatchersComposer( + room.getYoutubeWatchers()).compose()); + } + WiredManager.triggerUserEntersRoom(room, habbo.getRoomUnit()); room.habboEntered(habbo); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java index 18163a51..5d6296dc 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/PacketManager.java @@ -677,5 +677,9 @@ public class PacketManager { this.registerHandler(Incoming.GameCenterLeaveGameEvent, GameCenterLeaveGameEvent.class); this.registerHandler(Incoming.GameCenterEvent, GameCenterEvent.class); this.registerHandler(Incoming.GameCenterRequestGameStatusEvent, GameCenterRequestGameStatusEvent.class); + + // YouTube Room Broadcast + this.registerHandler(Incoming.YouTubeRoomPlayEvent, com.eu.habbo.messages.incoming.rooms.youtube.YouTubeRoomPlayEvent.class); + this.registerHandler(Incoming.YouTubeRoomWatchingEvent, com.eu.habbo.messages.incoming.rooms.youtube.YouTubeRoomWatchingEvent.class); } } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java index 9b99e7ab..5324b750 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/Incoming.java @@ -436,4 +436,8 @@ public class Incoming { public static final int SetActivePrefixEvent = 7012; public static final int DeletePrefixEvent = 7013; public static final int PurchasePrefixEvent = 7014; + + // YouTube Room Broadcast + public static final int YouTubeRoomPlayEvent = 8001; + public static final int YouTubeRoomWatchingEvent = 8002; } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomPlayEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomPlayEvent.java new file mode 100644 index 00000000..892d68ff --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomPlayEvent.java @@ -0,0 +1,39 @@ +package com.eu.habbo.messages.incoming.rooms.youtube; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.youtube.YouTubeRoomBroadcastComposer; + +import java.util.ArrayList; +import java.util.List; + +public class YouTubeRoomPlayEvent extends MessageHandler { + @Override + public void handle() throws Exception { + Habbo habbo = this.client.getHabbo(); + if (habbo == null) return; + + Room room = habbo.getHabboInfo().getCurrentRoom(); + if (room == null) return; + + // Only the room owner or users with rights can broadcast + if (!room.isOwner(habbo) && !room.hasRights(habbo)) return; + + String videoId = this.packet.readString(); + + int playlistCount = this.packet.readInt(); + List playlist = new ArrayList<>(); + for (int i = 0; i < playlistCount && i < 50; i++) { + playlist.add(this.packet.readString()); + } + + // Store the current video + playlist on the room + room.setYoutubeVideo(videoId, habbo.getHabboInfo().getUsername(), playlist); + + // Broadcast to everyone in the room + room.sendComposer( + new YouTubeRoomBroadcastComposer(videoId, habbo.getHabboInfo().getUsername(), playlist).compose() + ); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomWatchingEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomWatchingEvent.java new file mode 100644 index 00000000..670d9497 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/youtube/YouTubeRoomWatchingEvent.java @@ -0,0 +1,30 @@ +package com.eu.habbo.messages.incoming.rooms.youtube; + +import com.eu.habbo.habbohotel.rooms.Room; +import com.eu.habbo.habbohotel.users.Habbo; +import com.eu.habbo.messages.incoming.MessageHandler; +import com.eu.habbo.messages.outgoing.rooms.youtube.YouTubeRoomWatchersComposer; + +public class YouTubeRoomWatchingEvent extends MessageHandler { + @Override + public void handle() throws Exception { + Habbo habbo = this.client.getHabbo(); + if (habbo == null) return; + + Room room = habbo.getHabboInfo().getCurrentRoom(); + if (room == null) return; + + boolean watching = this.packet.readBoolean(); + int userId = habbo.getHabboInfo().getId(); + + if (watching) { + room.getYoutubeWatchers().add(userId); + } else { + room.getYoutubeWatchers().remove(userId); + } + + room.sendComposer( + new YouTubeRoomWatchersComposer(room.getYoutubeWatchers()).compose() + ); + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java index f354973e..bce53254 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/Outgoing.java @@ -571,4 +571,8 @@ public class Outgoing { public static final int ActivePrefixUpdatedComposer = 7003; public static final int AvailableCommandsComposer = 4050; + // YouTube Room Broadcast + public static final int YouTubeRoomBroadcastComposer = 8001; + public static final int YouTubeRoomWatchersComposer = 8002; + } diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomBroadcastComposer.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomBroadcastComposer.java new file mode 100644 index 00000000..7f8680b3 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomBroadcastComposer.java @@ -0,0 +1,31 @@ +package com.eu.habbo.messages.outgoing.rooms.youtube; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.List; + +public class YouTubeRoomBroadcastComposer extends MessageComposer { + private final String videoId; + private final String senderName; + private final List playlist; + + public YouTubeRoomBroadcastComposer(String videoId, String senderName, List playlist) { + this.videoId = videoId; + this.senderName = senderName; + this.playlist = playlist; + } + + @Override + protected ServerMessage composeInternal() { + this.response.init(Outgoing.YouTubeRoomBroadcastComposer); + this.response.appendString(this.videoId); + this.response.appendString(this.senderName); + this.response.appendInt(this.playlist.size()); + for (String id : this.playlist) { + this.response.appendString(id); + } + return this.response; + } +} diff --git a/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomWatchersComposer.java b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomWatchersComposer.java new file mode 100644 index 00000000..d57a3463 --- /dev/null +++ b/Emulator/src/main/java/com/eu/habbo/messages/outgoing/rooms/youtube/YouTubeRoomWatchersComposer.java @@ -0,0 +1,25 @@ +package com.eu.habbo.messages.outgoing.rooms.youtube; + +import com.eu.habbo.messages.ServerMessage; +import com.eu.habbo.messages.outgoing.MessageComposer; +import com.eu.habbo.messages.outgoing.Outgoing; + +import java.util.Set; + +public class YouTubeRoomWatchersComposer extends MessageComposer { + private final Set watcherIds; + + public YouTubeRoomWatchersComposer(Set watcherIds) { + this.watcherIds = watcherIds; + } + + @Override + protected ServerMessage composeInternal() { + this.response.init(Outgoing.YouTubeRoomWatchersComposer); + this.response.appendInt(this.watcherIds.size()); + for (int id : this.watcherIds) { + this.response.appendInt(id); + } + return this.response; + } +}