Skip to content

Commit 9a90334

Browse files
committed
TrixiEther | Refuge Dobrochan Support
Posting works a little, but after a time - need to investigate further
1 parent 76f4298 commit 9a90334

File tree

6 files changed

+160
-3
lines changed

6 files changed

+160
-3
lines changed

engines/vichan/src/chan/content/VichanChanLocator.java

+54
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@
22

33
import android.net.Uri;
44

5+
import java.util.List;
6+
import java.util.regex.Pattern;
7+
58
public class VichanChanLocator extends ChanLocator {
69

710
protected static String DEFAULT_SEGMENT_PRESET = "vichan";
811

12+
private static final Pattern BOARD_PATH = Pattern.compile("/\\w+(?:/(?:(?:catalog|index|\\d+)\\.html)?)?");
13+
private static final Pattern THREAD_PATH = Pattern.compile("/\\w+/{1,2}thread/(\\d+).*\\.html");
14+
private static final Pattern ATTACHMENT_PATH = Pattern.compile("/\\w+/src/\\d+\\.\\w+");
15+
916
@Override
1017
public Uri createThreadUri(String boardName, String threadNumber) {
1118
return buildPath(DEFAULT_SEGMENT_PRESET, boardName, "res", threadNumber + ".json");
@@ -28,4 +35,51 @@ public Uri createThumbnailUri(String boardName, String thumbnail) {
2835
return buildPath(DEFAULT_SEGMENT_PRESET, boardName, "thumb", thumbnail);
2936
}
3037

38+
public Uri createAntispamUri(String boardName, String threadNumber) {
39+
return threadNumber != null ? super.createThreadUri(boardName, threadNumber)
40+
: super.createBoardUri(boardName, 0);
41+
}
42+
43+
@Override
44+
public String getThreadNumber(Uri uri) {
45+
return uri != null ? getGroupValue(uri.getPath(), THREAD_PATH, 1) : null;
46+
}
47+
48+
@Override
49+
public String getPostNumber(Uri uri) {
50+
String fragment = uri.getFragment();
51+
if (fragment != null && fragment.startsWith("q")) {
52+
return fragment.substring(1);
53+
}
54+
return fragment;
55+
}
56+
57+
@Override
58+
public boolean isBoardUri(Uri uri) {
59+
return isChanHostOrRelative(uri) && isPathMatches(uri, BOARD_PATH);
60+
}
61+
62+
@Override
63+
public boolean isThreadUri(Uri uri) {
64+
return isChanHostOrRelative(uri) && isPathMatches(uri, THREAD_PATH);
65+
}
66+
67+
@Override
68+
public boolean isAttachmentUri(Uri uri) {
69+
return isChanHostOrRelative(uri) && isPathMatches(uri, ATTACHMENT_PATH);
70+
}
71+
72+
@Override
73+
public String getBoardName(Uri uri) {
74+
if (uri != null) {
75+
List<String> segments = uri.getPathSegments();
76+
if (segments.size() > 0) {
77+
return segments.get(0);
78+
}
79+
}
80+
return null;
81+
}
82+
83+
84+
3185
}

engines/vichan/src/chan/content/VichanChanPerformer.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package chan.content;
22

33
import android.net.Uri;
4+
import android.util.Log;
45

56
import org.json.JSONArray;
67
import org.json.JSONException;
@@ -204,6 +205,9 @@ public ReadPostsResult onReadPosts(ReadPostsData data) throws HttpException, Inv
204205

205206
private static final String CAPTCHA_DATA_KEY_TYPE = "captchaType";
206207

208+
protected void parseAntispamFields(String text, MultipartEntity entity) throws ParseException {
209+
}
210+
207211
@Override
208212
public SendPostResult onSendPost(SendPostData data) throws HttpException, ApiException, InvalidResponseException {
209213
MultipartEntity entity = new MultipartEntity();
@@ -230,9 +234,13 @@ public SendPostResult onSendPost(SendPostData data) throws HttpException, ApiExc
230234
entity.add("json_response", "1");
231235

232236
VichanChanLocator locator = ChanLocator.get(this);
233-
Uri contentUri = data.threadNumber != null ? locator.createThreadUri(data.boardName, data.threadNumber)
234-
: locator.createBoardUri(data.boardName, 0);
237+
Uri contentUri = locator.createAntispamUri(data.boardName, data.threadNumber);
235238
String responseText = new HttpRequest(contentUri, data).perform().readString();
239+
try {
240+
parseAntispamFields(responseText, entity);
241+
} catch (ParseException e) {
242+
throw new InvalidResponseException();
243+
}
236244

237245
Uri uri = locator.buildPath("vichan","post.php");
238246
JSONObject jsonObject = null;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package com.trixiether.dashchan.chan.refugedobrochan;
2+
3+
import android.util.Log;
4+
import android.util.Pair;
5+
6+
import java.util.ArrayList;
7+
import java.util.Collections;
8+
import java.util.HashSet;
9+
10+
import chan.http.RequestEntity;
11+
import chan.text.ParseException;
12+
import chan.text.TemplateParser;
13+
import chan.util.StringUtils;
14+
15+
public class RefugeDobrochanAntispamFieldsParser {
16+
17+
private final HashSet<String> ignoreFields = new HashSet<>();
18+
private final HashSet<String> hiddenInputsNames = new HashSet<>();
19+
private final ArrayList<Pair<String, String>> fields = new ArrayList<>();
20+
21+
private boolean formParsing;
22+
private String fieldName;
23+
24+
private RefugeDobrochanAntispamFieldsParser(String source, RequestEntity entity, String... ignoreFields) throws ParseException {
25+
Collections.addAll(this.ignoreFields, ignoreFields);
26+
Collections.addAll(this.hiddenInputsNames, "user", "username", "login", "search",
27+
"q", "url", "firstname", "lastname", "text", "message", "hash");
28+
PARSER.parse(source, this);
29+
for (Pair<String, String> field : fields) {
30+
entity.add(field.first, field.second);
31+
Log.d("!!!", field.first + " - " + field.second);
32+
}
33+
}
34+
35+
public static void parseAndApply(String source, RequestEntity entity, String... ignoreFields)
36+
throws ParseException {
37+
new RefugeDobrochanAntispamFieldsParser(source, entity, ignoreFields);
38+
}
39+
40+
private static final TemplateParser<RefugeDobrochanAntispamFieldsParser> PARSER = TemplateParser.<RefugeDobrochanAntispamFieldsParser>builder()
41+
.equals("form", "name", "post").open((instance, holder, tagName, attributes) -> {
42+
holder.formParsing = true;
43+
return false;
44+
})
45+
.name("input").open((instance, holder, tagName, attributes) -> {
46+
if (holder.formParsing) {
47+
String name = StringUtils.unescapeHtml(attributes.get("name"));
48+
boolean findTag = true;
49+
for (String s : holder.ignoreFields) {
50+
if (s.equals(name)) {
51+
findTag = false;
52+
break;
53+
}
54+
}
55+
if (findTag) {
56+
if (!name.contains("delete")) {
57+
String value = StringUtils.unescapeHtml(attributes.get("value"));
58+
holder.fields.add(new Pair<>(StringUtils.unescapeHtml(name), value));
59+
}
60+
}
61+
}
62+
return false;
63+
})
64+
.name("textarea").open((instance, holder, tagName, attributes) -> {
65+
holder.fieldName = StringUtils.unescapeHtml(attributes.get("name"));
66+
return true;
67+
})
68+
.content((instance, holder, source) -> {
69+
if (holder.formParsing) {
70+
if (!source.isEmpty()) {
71+
for (String s : holder.hiddenInputsNames)
72+
if (s.equals(holder.fieldName))
73+
holder.fields.add(new Pair<>(holder.fieldName, StringUtils.unescapeHtml(source)));
74+
}
75+
}
76+
})
77+
.prepare();
78+
}

extensions/refugedobrochan/src/com/trixiether/dashchan/chan/refugedobrochan/RefugeDobrochanChanLocator.java

+8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.trixiether.dashchan.chan.refugedobrochan;
22

3+
import android.net.Uri;
4+
35
import chan.content.VichanChanLocator;
46

57
public class RefugeDobrochanChanLocator extends VichanChanLocator {
@@ -9,4 +11,10 @@ public RefugeDobrochanChanLocator() {
911
setHttpsMode(HttpsMode.HTTPS_ONLY);
1012
DEFAULT_SEGMENT_PRESET = "vichan";
1113
}
14+
15+
@Override
16+
public Uri createAntispamUri(String boardName, String threadNumber) {
17+
return threadNumber != null ? super.buildPath(DEFAULT_SEGMENT_PRESET, boardName, "res", threadNumber + ".html")
18+
: super.buildPath(DEFAULT_SEGMENT_PRESET, boardName);
19+
}
1220
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
package com.trixiether.dashchan.chan.refugedobrochan;
22

33
import chan.content.VichanChanPerformer;
4+
import chan.http.MultipartEntity;
5+
import chan.text.ParseException;
46

5-
public class RefugeDobrochanChanPerformer extends VichanChanPerformer {}
7+
public class RefugeDobrochanChanPerformer extends VichanChanPerformer {
8+
@Override
9+
protected void parseAntispamFields(String text, MultipartEntity entity) throws ParseException {
10+
RefugeDobrochanAntispamFieldsParser.parseAndApply(text, entity, "board", "thread", "name", "email",
11+
"subject", "body", "password", "file", "spoiler", "json_response", "reason", "report");
12+
}
13+
}

settings.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
include ':engines:vichan'
12
includeBuild 'library'
23
file('engines').listFiles().each { include ":engines:$it.name" }
34
file('extensions').listFiles().each { include ":extensions:$it.name" }

0 commit comments

Comments
 (0)