Skip to content

Commit

Permalink
nodeinfoにリバーシ連合の機能レベルを含める (#379)
Browse files Browse the repository at this point in the history
  • Loading branch information
kozakura913 authored Aug 27, 2024
1 parent 1087514 commit a8da3e9
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 1 deletion.
3 changes: 2 additions & 1 deletion packages/backend/src/core/FetchInstanceMetadataService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type NodeInfo = {
email?: unknown;
};
themeColor?: unknown;
reversiVersion?: unknown;
};
};

Expand Down Expand Up @@ -138,7 +139,7 @@ export class FetchInstanceMetadataService {
}

@bindThis
private async fetchNodeinfo(instance: MiInstance): Promise<NodeInfo> {
public async fetchNodeinfo(instance: MiInstance): Promise<NodeInfo> {
this.logger.info(`Fetching nodeinfo of ${instance.host} ...`);

try {
Expand Down
40 changes: 40 additions & 0 deletions packages/backend/src/core/ReversiService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import { NotificationService } from '@/core/NotificationService.js';
import { Serialized } from '@/types.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import type Logger from '@/logger.js';
import { FetchInstanceMetadataService } from '@/core/FetchInstanceMetadataService.js';
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
import { NodeinfoServerService } from '@/server/NodeinfoServerService.js';
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
import { ApRendererService } from './activitypub/ApRendererService.js';
import { ApDeliverManagerService } from './activitypub/ApDeliverManagerService.js';
Expand Down Expand Up @@ -54,6 +57,8 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
private apDeliverManagerService: ApDeliverManagerService,
private loggerService: LoggerService,
private idService: IdService,
private federatedInstanceService: FederatedInstanceService,
private fetchInstanceMetadataService: FetchInstanceMetadataService,
) {
this.logger = this.loggerService.getLogger('reversi');
}
Expand Down Expand Up @@ -100,6 +105,41 @@ export class ReversiService implements OnApplicationShutdown, OnModuleInit {
} satisfies Partial<MiReversiGame>;
}

@bindThis
public async remoteVersion(host:string): Promise<string | null> {
const cache = await this.redisClient.get(`reversi:federation:version:${host}`);
if (cache !== null) {
return cache.length === 0 ? null : cache;
}
const instance = await this.federatedInstanceService.fetch(host);
const nodeinfo = await this.fetchInstanceMetadataService.fetchNodeinfo(instance);
const reversiVersion = nodeinfo.metadata?.reversiVersion;
if (typeof(reversiVersion) === 'string') {
//0.0.0-foo => 0.0.0
const version = reversiVersion.split('-')[0];
await this.redisClient.setex(`reversi:federation:version:${host}`, version, 5 * 60);
return version;
}
await this.redisClient.setex(`reversi:federation:version:${host}`, '', 5 * 60);
return null;
}
@bindThis
public async federationAvailable(host:string): Promise<boolean | null> {
const version = await this.remoteVersion(host);
if (version === null) {
//初期の実装はバージョンを返さない
return null;
}
const versionElements = version.split('.');
if (versionElements.length === 3) {
if (versionElements[0] !== NodeinfoServerService.reversiVersion.split('-')[0].split('.')[0]) {
//メジャーバージョン不一致
return false;
}
}
return true;
}

@bindThis
public async matchSpecificUser(me: MiUser, targetUser: MiUser, multiple = false, accept_only = false): Promise<MiReversiGame | null> {
if (targetUser.id === me.id) {
Expand Down
5 changes: 5 additions & 0 deletions packages/backend/src/core/activitypub/models/ApGameService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { NotificationService } from '@/core/NotificationService.js';
import { ReversiService } from '@/core/ReversiService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import type { ReversiGamesRepository } from '@/models/_.js';
import { NodeinfoServerService } from '@/server/NodeinfoServerService.js';
import { ApLoggerService } from '../ApLoggerService.js';
import { ApResolverService } from '../ApResolverService.js';
import { UserEntityService } from '../../entities/UserEntityService.js';
Expand Down Expand Up @@ -93,6 +94,10 @@ export class ApGameService {
const targetUser = local_user;
const fromUser = remote_user;
if (!game.game_state.game_session_id) throw Error('bad session' + JSON.stringify(game));
if (await this.reversiService.federationAvailable(remote_user.host) === false) {
//確実に利用できない時
return;
}
const redisPipeline = this.redisClient.pipeline();
redisPipeline.zadd(`reversi:matchSpecific:${targetUser.id}`, Date.now(), JSON.stringify( {
from_user_id: fromUser.id,
Expand Down
3 changes: 3 additions & 0 deletions packages/backend/src/server/NodeinfoServerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ const nodeinfo_homepage = 'https://misskey-hub.net';

@Injectable()
export class NodeinfoServerService {
//semverに従って割り当てる
static reversiVersion = '1.0.0-yojo';
constructor(
@Inject(DI.config)
private config: Config,
Expand Down Expand Up @@ -131,6 +133,7 @@ export class NodeinfoServerService {
enableServiceWorker: meta.enableServiceWorker,
proxyAccountName: proxyAccount ? proxyAccount.username : null,
themeColor: meta.themeColor ?? '#ffbcdc',
reversiVersion: NodeinfoServerService.reversiVersion,
},
};
if (version >= 21) {
Expand Down

0 comments on commit a8da3e9

Please sign in to comment.