Compare commits

...

2 commits

Author SHA1 Message Date
2991122668 bump version 2024-12-05 21:57:49 -05:00
d111fe935b Block improvements
It will now hide posts if a blocked user is mentioned, or if it's a reblog of a reply to a blocked user.
2024-12-05 21:55:11 -05:00
6 changed files with 38 additions and 3 deletions

View file

@ -1,3 +1,6 @@
## 2024.9.2 (eGirlskey)
- Improvements to user block: posts should now get properly hidden if they are replies to or mentions of a blocked user.
## 2024.9.1 (eGirlskey)
- Impersonate `misskey` upstream in nodeinfo to fix issues with client apps
- Fix two-factor-auth login with `secureApiMode: true` by returning a stub user to unauthorized clients.

View file

@ -1,6 +1,6 @@
{
"name": "egirlskey",
"version": "2024.9.1",
"version": "2024.9.2",
"codename": "boobdog",
"repository": {
"type": "git",

View file

@ -70,27 +70,38 @@ export class QueryService {
// ここでいうBlockedは被Blockedの意
@bindThis
public generateBlockedUserQuery(q: SelectQueryBuilder<any>, me: { id: MiUser['id'] }): void {
const blockedQuery = this.blockingsRepository.createQueryBuilder('blocking')
.select('blocking.blockeeId')
.where('blocking.blockerId = :blockerId', { blockerId: me.id });
const blockingQuery = this.blockingsRepository.createQueryBuilder('blocking')
.select('blocking.blockerId')
.where('blocking.blockeeId = :blockeeId', { blockeeId: me.id });
const mentionQuery = `SELECT COUNT(*) FROM unnest(note.mentions) mention WHERE mention IN (${blockingQuery.getQuery()}) OR mention IN (${blockedQuery.getQuery()}) LIMIT 1`;
// 投稿の作者にブロックされていない かつ
// 投稿の返信先の作者にブロックされていない かつ
// 投稿の引用元の作者にブロックされていない
q
.andWhere(`note.userId NOT IN (${ blockingQuery.getQuery() })`)
.andWhere(`note.userId NOT IN (${ blockedQuery.getQuery() })`)
.andWhere(new Brackets(qb => {
qb
.where('note.replyUserId IS NULL')
.orWhere(`note.replyUserId NOT IN (${ blockedQuery.getQuery() })`)
.orWhere(`note.replyUserId NOT IN (${ blockingQuery.getQuery() })`);
}))
.andWhere(new Brackets(qb => {
qb
.where('note.renoteUserId IS NULL')
.orWhere(`note.renoteUserId NOT IN (${ blockedQuery.getQuery() })`)
.orWhere(`note.renoteUserId NOT IN (${ blockingQuery.getQuery() })`);
}));
}))
.andWhere(`(${mentionQuery}) = 0`);
q.setParameters(blockingQuery.getParameters());
q.setParameters(blockedQuery.getParameters());
}
@bindThis

View file

@ -4,6 +4,8 @@
*/
export function isUserRelated(note: any, userIds: Set<string>, ignoreAuthor = false): boolean {
console.log(note);
if (!note) {
return false;
}
@ -20,5 +22,13 @@ export function isUserRelated(note: any, userIds: Set<string>, ignoreAuthor = fa
return true;
}
if (!ignoreAuthor && note.mentions != null && note.mentions.some(mention => userIds.has(mention))) {
return true;
}
if (!ignoreAuthor && note.renote != null && note.renote.mentions != null && note.renote.mentions.some(mention => userIds.has(mention))) {
return true;
}
return false;
}

View file

@ -42,6 +42,7 @@ export default class Connection {
public followingChannels: Set<string> = new Set();
public userIdsWhoMeMuting: Set<string> = new Set();
public userIdsWhoBlockingMe: Set<string> = new Set();
public userIdsWhoMeBlocking: Set<string> = new Set();
public userIdsWhoMeMutingRenotes: Set<string> = new Set();
public userMutedInstances: Set<string> = new Set();
private fetchIntervalId: NodeJS.Timeout | null = null;
@ -72,12 +73,13 @@ export default class Connection {
@bindThis
public async fetch() {
if (this.user == null) return;
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeMutingRenotes] = await Promise.all([
const [userProfile, following, followingChannels, userIdsWhoMeMuting, userIdsWhoBlockingMe, userIdsWhoMeBlocking, userIdsWhoMeMutingRenotes] = await Promise.all([
this.cacheService.userProfileCache.fetch(this.user.id),
this.cacheService.userFollowingsCache.fetch(this.user.id),
this.channelFollowingService.userFollowingChannelsCache.fetch(this.user.id),
this.cacheService.userMutingsCache.fetch(this.user.id),
this.cacheService.userBlockedCache.fetch(this.user.id),
this.cacheService.userBlockingCache.fetch(this.user.id),
this.cacheService.renoteMutingsCache.fetch(this.user.id),
]);
this.userProfile = userProfile;
@ -85,6 +87,7 @@ export default class Connection {
this.followingChannels = followingChannels;
this.userIdsWhoMeMuting = userIdsWhoMeMuting;
this.userIdsWhoBlockingMe = userIdsWhoBlockingMe;
this.userIdsWhoMeBlocking = userIdsWhoMeBlocking;
this.userIdsWhoMeMutingRenotes = userIdsWhoMeMutingRenotes;
this.userMutedInstances = new Set(userProfile.mutedInstances);
}
@ -253,6 +256,9 @@ export default class Connection {
if (this.userIdsWhoBlockingMe.has(noteUserId)) {
return;
}
if (this.userIdsWhoMeBlocking.has(noteUserId)) {
return;
}
}
}

View file

@ -47,6 +47,10 @@ export default abstract class Channel {
return this.connection.userIdsWhoBlockingMe;
}
protected get userIdsWhoMeBlocking() {
return this.connection.userIdsWhoMeBlocking;
}
protected get userMutedInstances() {
return this.connection.userMutedInstances;
}
@ -70,6 +74,7 @@ export default abstract class Channel {
if (isUserRelated(note, this.userIdsWhoMeMuting)) return true;
// 流れてきたNoteがブロックされているユーザーが関わる
if (isUserRelated(note, this.userIdsWhoBlockingMe)) return true;
if (isUserRelated(note, this.userIdsWhoMeBlocking)) return true;
// 流れてきたNoteがリートをミュートしてるユーザが行ったもの
if (isRenotePacked(note) && !isQuotePacked(note) && this.userIdsWhoMeMutingRenotes.has(note.user.id)) return true;