Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nodeinfoにリバーシ連合の機能レベルを含める #379

Merged
merged 6 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading