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;