hardcode lainchan boards

fixes for hardcoded boards.
refactor-toolbar
Floens 8 years ago
parent 31678e104e
commit c1b1e67bc6
  1. 4
      Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java
  2. 21
      Clover/app/src/main/java/org/floens/chan/core/site/Site.java
  3. 2
      Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java
  4. 6
      Clover/app/src/main/java/org/floens/chan/core/site/SiteRegistry.java
  5. 24
      Clover/app/src/main/java/org/floens/chan/core/site/common/CommonSite.java
  6. 75
      Clover/app/src/main/java/org/floens/chan/core/site/common/vichan/VichanEndpoints.java
  7. 44
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java
  8. 80
      Clover/app/src/main/java/org/floens/chan/core/site/sites/lainchan/Lainchan.java

@ -107,7 +107,7 @@ public class BoardSetupPresenter {
public void onAddDialogPositiveClicked() { public void onAddDialogPositiveClicked() {
int count = 0; int count = 0;
if (site.boardsType() == Site.BoardsType.DYNAMIC) { if (site.boardsType().canList) {
List<Board> siteBoards = boardManager.getSiteBoards(site); List<Board> siteBoards = boardManager.getSiteBoards(site);
Map<String, Board> siteBoardsByCode = new HashMap<>(); Map<String, Board> siteBoardsByCode = new HashMap<>();
for (Board siteBoard : siteBoards) { for (Board siteBoard : siteBoards) {
@ -169,7 +169,7 @@ public class BoardSetupPresenter {
userQuery.replace("/", "").replace("\\", ""); userQuery.replace("/", "").replace("\\", "");
suggestionCall = BackgroundUtils.runWithExecutor(executor, () -> { suggestionCall = BackgroundUtils.runWithExecutor(executor, () -> {
List<BoardSuggestion> suggestions = new ArrayList<>(); List<BoardSuggestion> suggestions = new ArrayList<>();
if (site.boardsType() == Site.BoardsType.DYNAMIC) { if (site.boardsType().canList) {
List<Board> siteBoards = boardManager.getSiteBoards(site); List<Board> siteBoards = boardManager.getSiteBoards(site);
List<Board> allUnsavedBoards = new ArrayList<>(); List<Board> allUnsavedBoards = new ArrayList<>();
for (Board siteBoard : siteBoards) { for (Board siteBoard : siteBoards) {

@ -88,17 +88,28 @@ public interface Site {
/** /**
* The site's boards are static, there is no extra info for a board in the api. * The site's boards are static, there is no extra info for a board in the api.
*/ */
STATIC, STATIC(true),
/** /**
* The site's boards are dynamic, a boards.json like endpoint is available to get the available boards. * The site's boards are dynamic, a boards.json like endpoint is available to get the available boards.
*/ */
DYNAMIC, DYNAMIC(true),
/** /**
* The site's boards are dynamic and infinite, existence of boards should be checked per board. * The site's boards are dynamic and infinite, existence of boards should be checked per board.
*/ */
INFINITE INFINITE(false);
/**
* Can the boards be listed, in other words, can
* {@link SiteActions#boards(SiteActions.BoardsListener)} be used, and is
* {@link #board(String)} available.
*/
public boolean canList;
BoardsType(boolean canList) {
this.canList = canList;
}
} }
/** /**
@ -147,7 +158,7 @@ public interface Site {
/** /**
* Return the board for this site with the given {@code code}. * Return the board for this site with the given {@code code}.
* <p>This does not need to create the board if it doesn't exist. This is important for * <p>This does not need to create the board if it doesn't exist. This is important for
* sites that have a board type different to DYNAMIC. Returning from the database is * sites that have the board type INFINITE. Returning from the database is
* enough.</p> * enough.</p>
* *
* @param code the board code * @param code the board code
@ -157,7 +168,7 @@ public interface Site {
/** /**
* Create a new board with the specified {@code code} and {@code name}. * Create a new board with the specified {@code code} and {@code name}.
* <p>This is only applicable to sites with a board type other than DYNAMIC.</p> * <p>This is only applicable to sites with a board type INFINITE.</p>
* *
* @param name the name of the board. * @param name the name of the board.
* @param code the code to create the board with. * @param code the code to create the board with.

@ -71,7 +71,7 @@ public abstract class SiteBase implements Site {
initializeSettings(); initializeSettings();
if (boardsType() == BoardsType.DYNAMIC) { if (boardsType().canList) {
actions().boards(boards -> boardManager.createAll(boards.boards)); actions().boards(boards -> boardManager.createAll(boards.boards));
} }
} }

@ -21,7 +21,7 @@ import android.util.SparseArray;
import org.floens.chan.core.site.sites.chan4.Chan4; import org.floens.chan.core.site.sites.chan4.Chan4;
import org.floens.chan.core.site.sites.lainchan.Lainchan; import org.floens.chan.core.site.sites.lainchan.Lainchan;
import org.floens.chan.core.site.sites.vichan.ViChan; import org.floens.chan.core.site.sites.chan8.Chan8;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -35,7 +35,7 @@ public class SiteRegistry {
static { static {
URL_HANDLERS.add(Chan4.URL_HANDLER); URL_HANDLERS.add(Chan4.URL_HANDLER);
URL_HANDLERS.add(ViChan.URL_HANDLER); URL_HANDLERS.add(Chan8.URL_HANDLER);
URL_HANDLERS.add(Lainchan.URL_HANDLER); URL_HANDLERS.add(Lainchan.URL_HANDLER);
} }
@ -45,7 +45,7 @@ public class SiteRegistry {
// find the correct class to use. // find the correct class to use.
SITE_CLASSES.put(0, Chan4.class); SITE_CLASSES.put(0, Chan4.class);
SITE_CLASSES.put(1, ViChan.class); SITE_CLASSES.put(1, Chan8.class);
SITE_CLASSES.put(2, Lainchan.class); SITE_CLASSES.put(2, Lainchan.class);
} }
} }

@ -28,6 +28,7 @@ import org.floens.chan.core.model.json.site.SiteConfig;
import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.model.orm.Board;
import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.orm.Loadable;
import org.floens.chan.core.settings.json.JsonSettings; import org.floens.chan.core.settings.json.JsonSettings;
import org.floens.chan.core.site.Boards;
import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Site;
import org.floens.chan.core.site.SiteActions; import org.floens.chan.core.site.SiteActions;
import org.floens.chan.core.site.SiteAuthentication; import org.floens.chan.core.site.SiteAuthentication;
@ -47,6 +48,9 @@ import org.floens.chan.core.site.parser.PostParser;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -73,6 +77,8 @@ public abstract class CommonSite extends SiteBase {
private PostParser postParser; private PostParser postParser;
private List<Board> staticBoards = new ArrayList<>();
@Override @Override
public void initialize(int id, SiteConfig config, JsonSettings userSettings) { public void initialize(int id, SiteConfig config, JsonSettings userSettings) {
super.initialize(id, config, userSettings); super.initialize(id, config, userSettings);
@ -135,6 +141,11 @@ public abstract class CommonSite extends SiteBase {
this.boardsType = boardsType; this.boardsType = boardsType;
} }
public void setBoards(Board... boards) {
boardsType = BoardsType.STATIC;
staticBoards.addAll(Arrays.asList(boards));
}
public void setConfig(CommonConfig config) { public void setConfig(CommonConfig config) {
this.config = config; this.config = config;
} }
@ -303,7 +314,13 @@ public abstract class CommonSite extends SiteBase {
} }
} }
public abstract class CommonEndpoints implements SiteEndpoints { public static abstract class CommonEndpoints implements SiteEndpoints {
private CommonSite commonSite;
public CommonEndpoints(CommonSite commonSite) {
this.commonSite = commonSite;
}
@NonNull @NonNull
public SimpleHttpUrl from(String url) { public SimpleHttpUrl from(String url) {
return new SimpleHttpUrl(url); return new SimpleHttpUrl(url);
@ -360,7 +377,7 @@ public abstract class CommonSite extends SiteBase {
} }
} }
public class SimpleHttpUrl { public static class SimpleHttpUrl {
@NonNull @NonNull
public HttpUrl.Builder url; public HttpUrl.Builder url;
@ -399,6 +416,9 @@ public abstract class CommonSite extends SiteBase {
@Override @Override
public void boards(BoardsListener boardsListener) { public void boards(BoardsListener boardsListener) {
if (!staticBoards.isEmpty()) {
boardsListener.onBoardsReceived(new Boards(staticBoards));
}
} }
@Override @Override

@ -0,0 +1,75 @@
/*
* Clover - 4chan browser https://github.com/Floens/Clover/
* Copyright (C) 2014 Floens
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site.common.vichan;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.orm.Board;
import org.floens.chan.core.model.orm.Loadable;
import org.floens.chan.core.site.common.CommonSite;
import java.util.Locale;
import java.util.Map;
import okhttp3.HttpUrl;
public class VichanEndpoints extends CommonSite.CommonEndpoints {
protected final CommonSite.SimpleHttpUrl root;
protected final CommonSite.SimpleHttpUrl sys;
public VichanEndpoints(CommonSite commonSite, String rootUrl, String sysUrl) {
super(commonSite);
root = new CommonSite.SimpleHttpUrl(rootUrl);
sys = new CommonSite.SimpleHttpUrl(sysUrl);
}
@Override
public HttpUrl catalog(Board board) {
return root.builder().s(board.code).s("catalog.json").url();
}
@Override
public HttpUrl thread(Board board, Loadable loadable) {
return root.builder().s(board.code).s("res").s(loadable.no + ".json").url();
}
@Override
public HttpUrl thumbnailUrl(Post.Builder post, boolean spoiler, Map<String, String> arg) {
return root.builder().s(post.board.code).s("thumb").s(arg.get("tim") + ".png").url();
}
@Override
public HttpUrl imageUrl(Post.Builder post, Map<String, String> arg) {
return root.builder().s(post.board.code).s("src").s(arg.get("tim") + "." + arg.get("ext")).url();
}
@Override
public HttpUrl icon(Post.Builder post, String icon, Map<String, String> arg) {
CommonSite.SimpleHttpUrl stat = root.builder().s("static");
if (icon.equals("country")) {
stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png");
}
return stat.url();
}
@Override
public HttpUrl reply(Loadable loadable) {
return sys.builder().s("post.php").url();
}
}

@ -1,9 +1,8 @@
package org.floens.chan.core.site.sites.vichan; package org.floens.chan.core.site.sites.chan8;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.orm.Board;
import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.model.orm.Loadable;
import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Site;
import org.floens.chan.core.site.SiteAuthentication; import org.floens.chan.core.site.SiteAuthentication;
@ -11,13 +10,13 @@ import org.floens.chan.core.site.SiteIcon;
import org.floens.chan.core.site.common.CommonSite; import org.floens.chan.core.site.common.CommonSite;
import org.floens.chan.core.site.common.MultipartHttpCall; import org.floens.chan.core.site.common.MultipartHttpCall;
import org.floens.chan.core.site.common.vichan.VichanApi; import org.floens.chan.core.site.common.vichan.VichanApi;
import org.floens.chan.core.site.common.vichan.VichanEndpoints;
import org.floens.chan.core.site.http.Reply; import org.floens.chan.core.site.http.Reply;
import org.floens.chan.core.site.http.ReplyResponse; import org.floens.chan.core.site.http.ReplyResponse;
import org.floens.chan.core.site.parser.CommentParser; import org.floens.chan.core.site.parser.CommentParser;
import org.floens.chan.core.site.parser.StyleRule; import org.floens.chan.core.site.parser.StyleRule;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -27,11 +26,11 @@ import okhttp3.Response;
import static android.text.TextUtils.isEmpty; import static android.text.TextUtils.isEmpty;
public class ViChan extends CommonSite { public class Chan8 extends CommonSite {
public static final CommonSiteUrlHandler URL_HANDLER = new CommonSiteUrlHandler() { public static final CommonSiteUrlHandler URL_HANDLER = new CommonSiteUrlHandler() {
@Override @Override
public Class<? extends Site> getSiteClass() { public Class<? extends Site> getSiteClass() {
return ViChan.class; return Chan8.class;
} }
@Override @Override
@ -62,7 +61,7 @@ public class ViChan extends CommonSite {
@Override @Override
public void setup() { public void setup() {
setName("8chan"); setName("8chan");
setIcon(SiteIcon.fromAssets("icons/8chan.png")); setIcon(SiteIcon.fromFavicon(HttpUrl.parse("https://8ch.net/favicon.ico")));
setBoardsType(BoardsType.INFINITE); setBoardsType(BoardsType.INFINITE);
setResolvable(URL_HANDLER); setResolvable(URL_HANDLER);
@ -74,20 +73,9 @@ public class ViChan extends CommonSite {
} }
}); });
setEndpoints(new CommonEndpoints() { setEndpoints(new VichanEndpoints(this,
private final SimpleHttpUrl root = from("https://8ch.net"); "https://8ch.net",
private final SimpleHttpUrl sys = from("https://sys.8ch.net"); "https://sys.8ch.net") {
@Override
public HttpUrl catalog(Board board) {
return root.builder().s(board.code).s("catalog.json").url();
}
@Override
public HttpUrl thread(Board board, Loadable loadable) {
return root.builder().s(board.code).s("res").s(loadable.no + ".json").url();
}
@Override @Override
public HttpUrl imageUrl(Post.Builder post, Map<String, String> arg) { public HttpUrl imageUrl(Post.Builder post, Map<String, String> arg) {
return root.builder().s("file_store").s(arg.get("tim") + "." + arg.get("ext")).url(); return root.builder().s("file_store").s(arg.get("tim") + "." + arg.get("ext")).url();
@ -110,22 +98,6 @@ public class ViChan extends CommonSite {
return root.builder().s("file_store").s("thumb").s(arg.get("tim") + "." + ext).url(); return root.builder().s("file_store").s("thumb").s(arg.get("tim") + "." + ext).url();
} }
@Override
public HttpUrl icon(Post.Builder post, String icon, Map<String, String> arg) {
SimpleHttpUrl stat = root.builder().s("static");
if (icon.equals("country")) {
stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png");
}
return stat.url();
}
@Override
public HttpUrl reply(Loadable loadable) {
return sys.builder().s("post.php").url();
}
}); });
setActions(new CommonActions() { setActions(new CommonActions() {

@ -1,3 +1,20 @@
/*
* Clover - 4chan browser https://github.com/Floens/Clover/
* Copyright (C) 2014 Floens
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site.sites.lainchan; package org.floens.chan.core.site.sites.lainchan;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -12,13 +29,13 @@ import org.floens.chan.core.site.common.CommonSite;
import org.floens.chan.core.site.common.MultipartHttpCall; import org.floens.chan.core.site.common.MultipartHttpCall;
import org.floens.chan.core.site.common.vichan.VichanAntispam; import org.floens.chan.core.site.common.vichan.VichanAntispam;
import org.floens.chan.core.site.common.vichan.VichanApi; import org.floens.chan.core.site.common.vichan.VichanApi;
import org.floens.chan.core.site.common.vichan.VichanEndpoints;
import org.floens.chan.core.site.http.Reply; import org.floens.chan.core.site.http.Reply;
import org.floens.chan.core.site.http.ReplyResponse; import org.floens.chan.core.site.http.ReplyResponse;
import org.floens.chan.core.site.parser.CommentParser; import org.floens.chan.core.site.parser.CommentParser;
import org.floens.chan.core.site.parser.StyleRule; import org.floens.chan.core.site.parser.StyleRule;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -64,7 +81,23 @@ public class Lainchan extends CommonSite {
public void setup() { public void setup() {
setName("Lainchan"); setName("Lainchan");
setIcon(SiteIcon.fromFavicon(HttpUrl.parse("https://lainchan.org/favicon.ico"))); setIcon(SiteIcon.fromFavicon(HttpUrl.parse("https://lainchan.org/favicon.ico")));
setBoardsType(BoardsType.INFINITE);
setBoards(
Board.fromSiteNameCode(this, "Programming", "λ"),
Board.fromSiteNameCode(this, "Do It Yourself", "Δ"),
Board.fromSiteNameCode(this, "Security", "sec"),
Board.fromSiteNameCode(this, "Technology", "Ω"),
Board.fromSiteNameCode(this, "Games and Interactive Media", "inter"),
Board.fromSiteNameCode(this, "Literature", "lit"),
Board.fromSiteNameCode(this, "Musical and Audible Media", "music"),
Board.fromSiteNameCode(this, "Visual Media", "vis"),
Board.fromSiteNameCode(this, "Humanity", "hum"),
Board.fromSiteNameCode(this, "Drugs 3.0", "drug"),
Board.fromSiteNameCode(this, "Consciousness and Dreams", "zzz"),
Board.fromSiteNameCode(this, "layer", "layer"),
Board.fromSiteNameCode(this, "Questions and Complaints", "q"),
Board.fromSiteNameCode(this, "Random", "r")
);
setResolvable(URL_HANDLER); setResolvable(URL_HANDLER);
@ -75,46 +108,9 @@ public class Lainchan extends CommonSite {
} }
}); });
setEndpoints(new CommonEndpoints() { setEndpoints(new VichanEndpoints(this,
private final SimpleHttpUrl root = from("https://lainchan.org"); "https://lainchan.org",
private final SimpleHttpUrl sys = from("https://lainchan.org"); "https://lainchan.org"));
@Override
public HttpUrl catalog(Board board) {
return root.builder().s(board.code).s("catalog.json").url();
}
@Override
public HttpUrl thread(Board board, Loadable loadable) {
return root.builder().s(board.code).s("res").s(loadable.no + ".json").url();
}
@Override
public HttpUrl thumbnailUrl(Post.Builder post, boolean spoiler, Map<String, String> arg) {
return root.builder().s(post.board.code).s("thumb").s(arg.get("tim") + ".png").url();
}
@Override
public HttpUrl imageUrl(Post.Builder post, Map<String, String> arg) {
return root.builder().s(post.board.code).s("src").s(arg.get("tim") + "." + arg.get("ext")).url();
}
@Override
public HttpUrl icon(Post.Builder post, String icon, Map<String, String> arg) {
SimpleHttpUrl stat = root.builder().s("static");
if (icon.equals("country")) {
stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png");
}
return stat.url();
}
@Override
public HttpUrl reply(Loadable loadable) {
return sys.builder().s("post.php").url();
}
});
setActions(new CommonActions() { setActions(new CommonActions() {
@Override @Override

Loading…
Cancel
Save