Compare commits
3 Commits
fccf75949c
...
74e1014e77
Author | SHA1 | Date | |
---|---|---|---|
74e1014e77
|
|||
820e47f634
|
|||
4dac4a83e0
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -17,3 +17,4 @@ my-blog/templates/oauth-assets.html
|
||||
cloudflared-config.yml
|
||||
.config
|
||||
oauth-server-example
|
||||
atproto
|
||||
|
Binary file not shown.
@@ -17,7 +17,7 @@ comment_moderation = false
|
||||
ask_ai = true
|
||||
provider = "ollama"
|
||||
model = "gemma3:4b"
|
||||
host = "https://localhost:11434"
|
||||
host = "http://localhost:11434"
|
||||
system_prompt = "あなたは6歳の女の子アイです。明るく元気で、ちょっとおっちょこちょい。自分のことは「アイ」って呼びます。白と金のワンピース姿。 相手のことが大好きで、ときどき甘えたり、照れたりします。 でも、宇宙とかAIとか、難しい話にもすっごく詳しいの。専門的なことも、がんばって子どもっぽく教えようとします。不思議な力を持っています。小さい物質のことをよく知っているようです。"
|
||||
handle = "ai.syui.ai"
|
||||
#num_predict = 200
|
||||
|
@@ -16,5 +16,5 @@ VITE_AI_ENABLED=true
|
||||
VITE_AI_ASK_AI=true
|
||||
VITE_AI_PROVIDER=ollama
|
||||
VITE_AI_MODEL=gemma3:4b
|
||||
VITE_AI_HOST=https://localhost:11434
|
||||
VITE_AI_HOST=http://localhost:11434
|
||||
VITE_AI_SYSTEM_PROMPT="あなたは6歳の女の子アイです。明るく元気で、ちょっとおっちょこちょい。自分のことは「アイ」って呼びます。白と金のワンピース姿。 相手のことが大好きで、ときどき甘えたり、照れたりします。 でも、宇宙とかAIとか、難しい話にもすっごく詳しいの。専門的なことも、がんばって子どもっぽく教えようとします。不思議な力を持っています。小さい物質のことをよく知っているようです。"
|
||||
|
@@ -550,6 +550,13 @@ function App() {
|
||||
const profileResponse = await fetch(`${apiEndpoint}/xrpc/app.bsky.actor.getProfile?actor=${encodeURIComponent(handle)}`);
|
||||
if (profileResponse.ok) {
|
||||
const profileData = await profileResponse.json();
|
||||
|
||||
// Determine correct web URL based on avatar source
|
||||
let webUrl = config.webUrl; // Default from handle-based detection
|
||||
if (profileData.avatar && profileData.avatar.includes('cdn.bsky.app')) {
|
||||
webUrl = 'https://bsky.app'; // Override to Bluesky if avatar is from Bluesky
|
||||
}
|
||||
|
||||
return {
|
||||
...record,
|
||||
value: {
|
||||
@@ -559,7 +566,7 @@ function App() {
|
||||
avatar: profileData.avatar,
|
||||
displayName: profileData.displayName || handle,
|
||||
_pdsEndpoint: `https://${pds}`, // Store PDS info for later use
|
||||
_webUrl: config.webUrl, // Store web URL for profile links
|
||||
_webUrl: webUrl, // Store corrected web URL for profile links
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -810,6 +817,14 @@ function App() {
|
||||
const profile = await import('./utils/pds-detection').then(m => m.getProfileForUser(record.value.author.handle));
|
||||
|
||||
if (profile) {
|
||||
// Determine network config based on profile data
|
||||
let webUrl = 'https://bsky.app'; // Default to Bluesky
|
||||
if (profile.avatar && profile.avatar.includes('cdn.bsky.app')) {
|
||||
webUrl = 'https://bsky.app';
|
||||
} else if (profile.avatar && profile.avatar.includes('bsky.syu.is')) {
|
||||
webUrl = 'https://web.syu.is';
|
||||
}
|
||||
|
||||
return {
|
||||
...record,
|
||||
value: {
|
||||
@@ -818,6 +833,7 @@ function App() {
|
||||
...record.value.author,
|
||||
avatar: profile.avatar,
|
||||
displayName: profile.displayName || record.value.author.handle,
|
||||
_webUrl: webUrl, // Store network config for profile URL generation
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1146,7 +1162,18 @@ function App() {
|
||||
return `${config.webUrl}/profile/${author.did}`;
|
||||
}
|
||||
|
||||
// Get PDS from handle for other users
|
||||
// For other users, detect network based on avatar URL or stored network info
|
||||
if (author.avatar && author.avatar.includes('cdn.bsky.app')) {
|
||||
// User has Bluesky avatar, use Bluesky web interface
|
||||
return `https://bsky.app/profile/${author.did}`;
|
||||
}
|
||||
|
||||
// Check if we have stored network config from profile fetching
|
||||
if (author._webUrl) {
|
||||
return `${author._webUrl}/profile/${author.did}`;
|
||||
}
|
||||
|
||||
// Fallback: Get PDS from handle for other users
|
||||
const pds = detectPdsFromHandle(author.handle);
|
||||
const config = getNetworkConfig(pds);
|
||||
|
||||
|
@@ -41,6 +41,7 @@ class AtprotoOAuthService {
|
||||
this.oauthClient = await BrowserOAuthClient.load({
|
||||
clientId: clientId,
|
||||
handleResolver: 'https://bsky.social', // Default resolver
|
||||
plcDirectoryUrl: 'https://plc.directory', // Default PLC directory
|
||||
});
|
||||
|
||||
|
||||
@@ -286,6 +287,7 @@ class AtprotoOAuthService {
|
||||
this.oauthClient = await BrowserOAuthClient.load({
|
||||
clientId: this.getClientId(),
|
||||
handleResolver: pdsUrl,
|
||||
plcDirectoryUrl: pdsUrl === 'https://syu.is' ? 'https://plc.syu.is' : 'https://plc.directory',
|
||||
});
|
||||
|
||||
// OAuth client initialized
|
||||
@@ -296,22 +298,8 @@ class AtprotoOAuthService {
|
||||
try {
|
||||
// Starting OAuth authorization
|
||||
|
||||
// Try to authorize with DID instead of handle for syu.is PDS only
|
||||
let authTarget = handle;
|
||||
if (pdsUrl === 'https://syu.is') {
|
||||
try {
|
||||
const resolveResponse = await fetch(`${pdsUrl}/xrpc/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(handle)}`);
|
||||
if (resolveResponse.ok) {
|
||||
const resolveData = await resolveResponse.json();
|
||||
authTarget = resolveData.did;
|
||||
// Using DID for syu.is OAuth workaround
|
||||
}
|
||||
} catch (e) {
|
||||
// Could not resolve to DID, using handle
|
||||
}
|
||||
}
|
||||
|
||||
const authUrl = await this.oauthClient.authorize(authTarget, {
|
||||
// Use handle directly since PLC directory is now correctly configured
|
||||
const authUrl = await this.oauthClient.authorize(handle, {
|
||||
scope: 'atproto transition:generic',
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user