diff --git a/README.md b/README.md
index c57324b..e21acbc 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# Download
-[Windows](https://github.com/mrstallion/fchat-rising/releases/download/v1.2.0/F-Chat-Rising-1.2.0-win.exe) (75 MB)
-| [MacOS](https://github.com/mrstallion/fchat-rising/releases/download/v1.2.0/F-Chat-Rising-1.2.0-macos.dmg) (76 MB)
-| [Linux](https://github.com/mrstallion/fchat-rising/releases/download/v1.2.0/F-Chat-Rising-1.2.0-linux.AppImage) (76 MB)
+[Windows](https://github.com/mrstallion/fchat-rising/releases/download/v1.3.0/F-Chat-Rising-1.3.0-win.exe) (75 MB)
+| [MacOS](https://github.com/mrstallion/fchat-rising/releases/download/v1.3.0/F-Chat-Rising-1.3.0-macos.dmg) (76 MB)
+| [Linux](https://github.com/mrstallion/fchat-rising/releases/download/v1.3.0/F-Chat-Rising-1.3.0-linux.AppImage) (76 MB)
# F-Chat Rising
diff --git a/chat/UserMenu.vue b/chat/UserMenu.vue
index 9f65c4f..72064e3 100644
--- a/chat/UserMenu.vue
+++ b/chat/UserMenu.vue
@@ -9,6 +9,11 @@
+
+
+
{{l('user.profile')}}
@@ -44,18 +49,21 @@
-
+
+
+
diff --git a/chat/preview/image-dom-mutator.ts b/chat/preview/image-dom-mutator.ts
index 3627d03..3125ffb 100644
--- a/chat/preview/image-dom-mutator.ts
+++ b/chat/preview/image-dom-mutator.ts
@@ -169,6 +169,7 @@ export class ImageDomMutator {
this.add('myhentaicomics.com', this.getBaseJsMutatorScript(['#entire_image img', 'video', 'img']));
this.add('redgifs.com', this.getBaseJsMutatorScript(['video']));
this.add('furaffinity.net', this.getBaseJsMutatorScript(['#submissionImg', 'video', 'img']));
+ this.add('rule34.paheal.net', this.getBaseJsMutatorScript(['#main_image', 'video', 'img']));
this.add(
'pornhub.com',
diff --git a/chat/preview/test-urls.txt b/chat/preview/test-urls.txt
index db134bf..4f5c143 100644
--- a/chat/preview/test-urls.txt
+++ b/chat/preview/test-urls.txt
@@ -83,8 +83,15 @@
[url=https://www.redgifs.com/watch/jampackedwaryafricanparadiseflycatcher-strap-on]Redgifs[/url]
+ [url=https://rule34.paheal.net/post/view/3035573#search=Mag%27har_Orc]Paheal.net video[/url]
+ [url=https://rule34.paheal.net/post/view/3380309#search=Mag%27har_Orc]Paheal.net image[/url]
+ [url=https://64.media.tumblr.com/110e76bb4559440b45d4aa26d58c3cf1/df18d6317be38533-e6/s540x810/ec545ae8a930d33f9175b82fa680f4f179ba834d.gifv]Tumblr image[/url]
+
+ [url=https://morphsbymig.tumblr.com/post/621869669856542720/morphsbymig-denise-milani-the-job-interview]Tumblr iframe[/url]
+
+ [url=https://www.furaffinity.net/view/38851727/]Furaffinity[/url]
Broken
diff --git a/learn/matcher.ts b/learn/matcher.ts
index 711b22f..6303640 100644
--- a/learn/matcher.ts
+++ b/learn/matcher.ts
@@ -29,6 +29,7 @@ export interface MatchReport {
them: MatchResult;
youMultiSpecies: boolean;
themMultiSpecies: boolean;
+ merged: MatchResultScores;
score: Scoring | null;
}
@@ -78,25 +79,43 @@ const scoreClasses: ScoreClassMap = {
[Scoring.MISMATCH]: 'mismatch'
};
+const scoreIcons: ScoreClassMap = {
+ [Scoring.MATCH]: 'fas fa-heart',
+ [Scoring.WEAK_MATCH]: 'fas fa-thumbs-up',
+ [Scoring.NEUTRAL]: 'fas fa-meh',
+ [Scoring.WEAK_MISMATCH]: 'fas fa-question-circle',
+ [Scoring.MISMATCH]: 'fas fa-heart-broken'
+};
+
export class Score {
readonly score: Scoring;
readonly description: string;
+ readonly shortDesc: string;
- constructor(score: Scoring, description: string = '') {
+ constructor(score: Scoring, description: string = '', shortDesc: string = '') {
if ((score !== Scoring.NEUTRAL) && (description === ''))
throw new Error('Description must be provided if score is not neutral');
this.score = score;
this.description = description;
+ this.shortDesc = shortDesc;
}
getRecommendedClass(): string {
return Score.getClasses(this.score);
}
+ getRecommendedIcon(): string {
+ return Score.getIcon(this.score);
+ }
+
static getClasses(score: Scoring): string {
return scoreClasses[score];
}
+
+ static getIcon(score: Scoring): string {
+ return scoreIcons[score];
+ }
}
export interface CharacterAnalysisVariation {
@@ -168,11 +187,15 @@ export class Matcher {
const youThem = new Matcher(you, them, yourAnalysis, theirAnalysis);
const themYou = new Matcher(them, you, theirAnalysis, yourAnalysis);
+ const youThemMatch = youThem.match();
+ const themYouMatch = themYou.match();
+
const report: MatchReport = {
- you: youThem.match(),
- them: themYou.match(),
+ you: youThemMatch,
+ them: themYouMatch,
youMultiSpecies: false,
themMultiSpecies: false,
+ merged: Matcher.mergeResults(youThemMatch, themYouMatch),
score: null
};
@@ -196,11 +219,15 @@ export class Matcher {
const youThem = new Matcher(yourAnalysis.character, theirAnalysis.character, yourAnalysis.analysis, theirAnalysis.analysis);
const themYou = new Matcher(theirAnalysis.character, yourAnalysis.character, theirAnalysis.analysis, yourAnalysis.analysis);
+ const youThemMatch = youThem.match();
+ const themYouMatch = themYou.match();
+
const report: MatchReport = {
- you: youThem.match(),
- them: themYou.match(),
+ you: youThemMatch,
+ them: themYouMatch,
youMultiSpecies: (yourCharacterAnalyses.length > 1),
themMultiSpecies: (theirCharacterAnalyses.length > 1),
+ merged: Matcher.mergeResults(youThemMatch, themYouMatch),
score: null
};
@@ -229,6 +256,32 @@ export class Matcher {
return bestReport!;
}
+
+ // tslint:disable-next-line
+ private static mergeResultScores(scores: MatchResultScores, results: MatchResultScores): void {
+ _.each(scores, (v: Score, k: any) => {
+ if (
+ // tslint:disable-next-line no-unsafe-any
+ ((!(k in results)) || (v.score < results[k].score))
+ && (v.score !== Scoring.NEUTRAL)
+ ) {
+ results[k] = v;
+ }
+ }
+ );
+ }
+
+
+ static mergeResults(you: MatchResult, them: MatchResult): MatchResultScores {
+ const results: MatchResultScores = {} as any;
+
+ Matcher.mergeResultScores(you.scores, results);
+ Matcher.mergeResultScores(them.scores, results);
+
+ return results;
+ }
+
+
static generateAnalysisVariations(c: Character): CharacterAnalysisVariation[] {
const speciesOptions = Matcher.getAllSpeciesAsStr(c);
@@ -753,7 +806,7 @@ export class Matcher {
const s = Matcher.getMappedSpecies(mySpecies.string);
if (!s) {
- console.log('Unknown species', c.name, mySpecies.string);
+ log.silly('matcher.species.unknown', { character: c.name, species: mySpecies.string });
}
return s;