diff --git a/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java b/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java index 53e01b91..a66712fb 100644 --- a/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java +++ b/src/main/java/ctbrec/sites/mfc/FriendsUpdateService.java @@ -4,7 +4,6 @@ package ctbrec.sites.mfc; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; import org.json.JSONObject; @@ -21,6 +20,12 @@ public class FriendsUpdateService extends PaginatedScheduledService { private static final transient Logger LOG = LoggerFactory.getLogger(FriendsUpdateService.class); private MyFreeCams myFreeCams; + private Mode mode = Mode.ONLINE; + + public static enum Mode { + ONLINE, + OFFLINE + } public FriendsUpdateService(MyFreeCams myFreeCams) { this.myFreeCams = myFreeCams; @@ -31,7 +36,7 @@ public class FriendsUpdateService extends PaginatedScheduledService { return new Task>() { @Override public List call() throws IOException { - List models = new ArrayList<>(); + List models = new ArrayList<>(); String url = myFreeCams.getBaseUrl() + "/php/manage_lists2.php?passcode=&list_type=friends&data_mode=online&get_user_list=1"; Request req = new Request.Builder() .url(url) @@ -69,25 +74,16 @@ public class FriendsUpdateService extends PaginatedScheduledService { LOG.error("Couldn't load friends list {} {}", resp.code(), resp.message()); resp.close(); } + boolean filterOnline = mode == Mode.ONLINE; return models.stream() - .sorted((a, b) -> { + .filter(m -> { try { - if(a.isOnline() && b.isOnline() || !a.isOnline() && !b.isOnline()) { - return a.getName().compareTo(b.getName()); - } else { - if(a.isOnline()) { - return -1; - } - if(b.isOnline()) { - return 1; - } - } - } catch (IOException | ExecutionException | InterruptedException e) { - LOG.warn("Couldn't sort friends list", e); - return 0; + return m.isOnline() == filterOnline; + } catch(Exception e) { + return false; } - return 0; }) + .sorted((m1,m2) -> (int)(m2.getCamScore() - m1.getCamScore())) .skip((page-1) * 50) .limit(50) .collect(Collectors.toList()); @@ -95,4 +91,7 @@ public class FriendsUpdateService extends PaginatedScheduledService { }; } + public void setMode(Mode mode) { + this.mode = mode; + } } diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java b/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java new file mode 100644 index 00000000..5a9829d8 --- /dev/null +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCamsFriendsTab.java @@ -0,0 +1,59 @@ +package ctbrec.sites.mfc; +import static ctbrec.sites.mfc.FriendsUpdateService.Mode.*; + +import java.util.concurrent.TimeUnit; + +import ctbrec.ui.ThumbOverviewTab; +import javafx.geometry.Insets; +import javafx.scene.Scene; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.HBox; +import javafx.util.Duration; + +public class MyFreeCamsFriendsTab extends ThumbOverviewTab { + public MyFreeCamsFriendsTab(MyFreeCams mfc) { + super("Friends", new FriendsUpdateService(mfc), mfc); + updateService.setPeriod(new Duration(TimeUnit.SECONDS.toMillis(10))); + } + + @Override + protected void createGui() { + super.createGui(); + addOnlineOfflineSelector(); + } + + private void addOnlineOfflineSelector() { + ToggleGroup group = new ToggleGroup(); + RadioButton online = new RadioButton("online"); + online.setToggleGroup(group); + RadioButton offline = new RadioButton("offline"); + offline.setToggleGroup(group); + pagination.getChildren().add(online); + pagination.getChildren().add(offline); + HBox.setMargin(online, new Insets(5,5,5,40)); + HBox.setMargin(offline, new Insets(5,5,5,5)); + online.setSelected(true); + group.selectedToggleProperty().addListener((e) -> { + if(online.isSelected()) { + ((FriendsUpdateService)updateService).setMode(ONLINE); + } else { + ((FriendsUpdateService)updateService).setMode(OFFLINE); + } + queue.clear(); + updateService.restart(); + }); + } + + public void setScene(Scene scene) { + scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> { + if(this.isSelected()) { + if(event.getCode() == KeyCode.DELETE) { + follow(selectedThumbCells, false); + } + } + }); + } +} diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java b/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java index f188d458..da2310c7 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCamsTabProvider.java @@ -31,10 +31,8 @@ public class MyFreeCamsTabProvider extends TabProvider { updateService.setPeriod(new Duration(TimeUnit.SECONDS.toMillis(10))); tabs.add(online); - updateService = new FriendsUpdateService(myFreeCams); - ThumbOverviewTab friends = new ThumbOverviewTab("Friends", updateService, myFreeCams); + ThumbOverviewTab friends = new MyFreeCamsFriendsTab(myFreeCams); friends.setRecorder(recorder); - updateService.setPeriod(new Duration(TimeUnit.SECONDS.toMillis(10))); tabs.add(friends); updateService = new HDCamsUpdateService(); diff --git a/src/main/java/ctbrec/ui/ThumbOverviewTab.java b/src/main/java/ctbrec/ui/ThumbOverviewTab.java index f4e6b45f..0e28a9b3 100644 --- a/src/main/java/ctbrec/ui/ThumbOverviewTab.java +++ b/src/main/java/ctbrec/ui/ThumbOverviewTab.java @@ -30,6 +30,7 @@ import ctbrec.Config; import ctbrec.Model; import ctbrec.recorder.Recorder; import ctbrec.sites.Site; +import ctbrec.sites.chaturbate.ChaturbateFollowedTab; import ctbrec.sites.mfc.MyFreeCamsClient; import ctbrec.sites.mfc.MyFreeCamsModel; import javafx.collections.ObservableList; @@ -61,20 +62,21 @@ import javafx.util.Duration; public class ThumbOverviewTab extends Tab implements TabSelectionListener { private static final transient Logger LOG = LoggerFactory.getLogger(ThumbOverviewTab.class); - static Set resolutionProcessing = Collections.synchronizedSet(new HashSet<>()); - static BlockingQueue queue = new LinkedBlockingQueue<>(); + protected static BlockingQueue queue = new LinkedBlockingQueue<>(); static ExecutorService threadPool = new ThreadPoolExecutor(2, 2, 10, TimeUnit.MINUTES, queue); + static Set resolutionProcessing = Collections.synchronizedSet(new HashSet<>()); + protected FlowPane grid = new FlowPane(); protected PaginatedScheduledService updateService; - Recorder recorder; + protected HBox pagination; + protected List selectedThumbCells = Collections.synchronizedList(new ArrayList<>()); + List filteredThumbCells = Collections.synchronizedList(new ArrayList<>()); - List selectedThumbCells = Collections.synchronizedList(new ArrayList<>()); + Recorder recorder; String filter; - FlowPane grid = new FlowPane(); ReentrantLock gridLock = new ReentrantLock(); ScrollPane scrollPane = new ScrollPane(); boolean loginRequired; - HBox pagination; TextField pageInput = new TextField(Integer.toString(1)); Button pagePrev = new Button("◀"); Button pageNext = new Button("▶"); @@ -93,7 +95,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { initializeUpdateService(); } - void createGui() { + protected void createGui() { grid.setPadding(new Insets(5)); grid.setHgap(5); grid.setVgap(5); @@ -389,7 +391,8 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { contextMenu.setAutoHide(true); contextMenu.setHideOnEscape(true); contextMenu.setAutoFix(true); - MenuItem followOrUnFollow = this instanceof FollowedTab ? unfollow : follow; + // TODO get rid of direct reference to Chaturbate + MenuItem followOrUnFollow = this instanceof ChaturbateFollowedTab ? unfollow : follow; contextMenu.getItems().addAll(openInPlayer, startStop); if(site.supportsFollow()) { contextMenu.getItems().add(followOrUnFollow); @@ -398,7 +401,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { contextMenu.getItems().add(sendTip); } contextMenu.getItems().addAll(copyUrl); - if(cell.getModel() instanceof MyFreeCamsModel && !Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + if(cell.getModel() instanceof MyFreeCamsModel && Objects.equals(System.getenv("CTBREC_DEV"), "1")) { MenuItem debug = new MenuItem("debug"); debug.setOnAction((e) -> { MyFreeCamsClient.getInstance().getSessionState(cell.getModel()); @@ -416,7 +419,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { } } - void follow(List selection, boolean follow) { + protected void follow(List selection, boolean follow) { for (ThumbCell thumbCell : selection) { thumbCell.follow(follow); }