ai/at
1
0

Compare commits

..

5 Commits

Author SHA1 Message Date
16e11575f6 fix age bypass 2026-01-10 11:26:21 +09:00
a25ed0e92c fix patch test 2026-01-08 14:15:36 +09:00
d99ca3fd8b fix readme 2025-12-27 16:06:57 +09:00
d735b1f214 fix install 2025-12-26 01:40:54 +09:00
bab1e653d9 test patch 2025-12-26 01:40:49 +09:00
8 changed files with 207 additions and 49 deletions

View File

@@ -11,7 +11,7 @@
|[at]mosphere|system|pds, bsky(appview), ozone, bgs, plc| |[at]mosphere|system|pds, bsky(appview), ozone, bgs, plc|
|[a]uthenticated [t]ransfer|protocol|[did](https://www.w3.org/TR/did-core/)| |[a]uthenticated [t]ransfer|protocol|[did](https://www.w3.org/TR/did-core/)|
- https://atproto.com/ja/guides/glossary - https://atproto.com/guides/glossary
## account ## account
@@ -41,8 +41,8 @@ $ curl -sL "syu.is/xrpc/com.atproto.repo.listRecords?repo=${handle}&collection=a
> at://did:plc:6qyecktefllvenje24fcxnie/app.bsky.feed.generator/app > at://did:plc:6qyecktefllvenje24fcxnie/app.bsky.feed.generator/app
- https://syu.is/profile/ai.syui.ai/feed/app - https://syu.is/profile/did:plc:6qyecktefllvenje24fcxnie/feed/app
- https://feed.syu.is/xrpc/app.bsky.feed.getFeedSkeleton?feed=at://did:plc:4hqjfn7m6n5hno3doamuhgef/app.bsky.feed.generator/app - https://feed.syu.is/xrpc/app.bsky.feed.getFeedSkeleton?feed=at://did:plc:6qyecktefllvenje24fcxnie/app.bsky.feed.generator/app
```json ```json
{ {

View File

@@ -276,6 +276,10 @@ function at-repos-patch-apply-all() {
repo="atproto" repo="atproto"
elif [[ $filename == *"feed"* ]]; then elif [[ $filename == *"feed"* ]]; then
repo="feed-generator" repo="feed-generator"
# feed-generatorパッチ適用前に既存のDockerfileを削除upstreamと競合回避
if [[ $filename == "200-feed-generator-custom.patch" ]]; then
rm -f "$d/repos/feed-generator/Dockerfile"
fi
fi fi
patch-apply "$title" "$repo" "$filename" patch-apply "$title" "$repo" "$filename"
@@ -331,6 +335,54 @@ export const SOCIAL_APP_DOMAIN =\
popd > /dev/null popd > /dev/null
} }
function at-repos-feed-generator-newfiles() {
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📝 Creating feed-generator new files..."
# Create app.ts
cat > $d/repos/feed-generator/src/algos/app.ts <<'EOF'
import { QueryParams } from '../lexicon/types/app/bsky/feed/getFeedSkeleton'
import { AppContext } from '../config'
// max 15 chars
export const shortname = 'app'
export const handler = async (ctx: AppContext, params: QueryParams) => {
let builder = ctx.db
.selectFrom('post')
.selectAll()
.orderBy('indexedAt', 'desc')
.orderBy('cid', 'desc')
.limit(params.limit)
if (params.cursor) {
const timeStr = new Date(parseInt(params.cursor, 10)).toISOString()
builder = builder.where('post.indexedAt', '<', timeStr)
}
const res = await builder.execute()
const feed = res.map((row) => ({
post: row.uri,
}))
let cursor: string | undefined
const last = res.at(-1)
if (last) {
cursor = new Date(last.indexedAt).getTime().toString(10)
}
return {
cursor,
feed,
}
}
EOF
echo "✅ Created src/algos/app.ts"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
}
function at-repos-build-docker-atproto() { function at-repos-build-docker-atproto() {
cd $d cd $d
docker image prune -a docker image prune -a
@@ -533,6 +585,7 @@ case "$1" in
at-repos-social-app-ios-patch at-repos-social-app-ios-patch
at-repos-patch-apply-all at-repos-patch-apply-all
at-repos-ozone-patch at-repos-ozone-patch
at-repos-feed-generator-newfiles
show-failed-patches show-failed-patches
exit exit
;; ;;
@@ -561,7 +614,7 @@ esac
case "`cat /etc/hostname`" in case "`cat /etc/hostname`" in
at) at)
if [ "$1" = "bgs-reset" ];then if [ "$1" = "bgs-reset" ];then
at-repos-reset-bgs-db # at-repos-reset-bgs-db
exit exit
fi fi
at-repos-pull-docker at-repos-pull-docker
@@ -574,6 +627,7 @@ case "`cat /etc/hostname`" in
at-repos-social-app-ios-patch at-repos-social-app-ios-patch
at-repos-patch-apply-all at-repos-patch-apply-all
at-repos-ozone-patch at-repos-ozone-patch
at-repos-feed-generator-newfiles
show-failed-patches show-failed-patches
at-repos-build-docker-atproto at-repos-build-docker-atproto
at-repos-push-docker at-repos-push-docker

View File

@@ -1,9 +1,7 @@
今回の./ios (social-app)開発の要点をまとめます。 今回の./ios (social-app)開発の要点をまとめます。
1. MITのライセンスを遵守すること、iosアプリとして出品しても問題ないようにすること 1. MITのライセンスを遵守すること、iosアプリとして出品しても問題ないようにすること
https://raw.githubusercontent.com/bluesky-social/social-app/refs/heads/main/LICENSE
2. "Bluesky"という名称を使用しないこと。アイコンの変更。リンクの変更 2. "Bluesky"という名称を使用しないこと。アイコンの変更。リンクの変更
3. selfhostでも動くこと。
3. selfhostでも動くこと。これはすでにpatchで実現しています。 https://raw.githubusercontent.com/bluesky-social/social-app/refs/heads/main/LICENSE

View File

@@ -78,11 +78,11 @@ function cleanup_build {
# 3. CocoaPods # 3. CocoaPods
echo "3. Installing CocoaPods..." echo "3. Installing CocoaPods..."
# Ensure PATH includes Homebrew ruby gems if needed if [ -z "$1" ];then
export PATH="/opt/homebrew/lib/ruby/gems/3.4.0/bin:$PATH"
cd ios cd ios
pod install pod install
cd .. cd ..
fi
# 4. Signing (Automated) # 4. Signing (Automated)
echo "4. Configuring Xcode Signing..." echo "4. Configuring Xcode Signing..."
@@ -132,6 +132,9 @@ EOF
case $1 in case $1 in
i) i)
echo "Skipping cleanup_build..."
;;
*)
cleanup_build cleanup_build
;; ;;
esac esac
@@ -167,8 +170,15 @@ cp -R ${APP_NAME}.xcarchive/Products/Applications/${APP_NAME}.app Payload/
# store.mobileprovisionの存在確認とコピー # store.mobileprovisionの存在確認とコピー
# https://developer.apple.com/account/resources/profiles/list # https://developer.apple.com/account/resources/profiles/list
if [ ! -f "$MOBILEPROVISION" ]; then if [ ! -f "$MOBILEPROVISION" ]; then
echo "Error: store.mobileprovision not found at $MOBILEPROVISION" # 親ディレクトリからコピーを試みる
PARENT_MOBILEPROVISION="$SCRIPT_DIR/../embedded.mobileprovision"
if [ -f "$PARENT_MOBILEPROVISION" ]; then
echo "Copying mobileprovision from $PARENT_MOBILEPROVISION to $MOBILEPROVISION"
cp "$PARENT_MOBILEPROVISION" "$MOBILEPROVISION"
else
echo "Error: store.mobileprovision not found at $MOBILEPROVISION or $PARENT_MOBILEPROVISION"
exit 1 exit 1
fi
fi fi
cp "$MOBILEPROVISION" Payload/${APP_NAME}.app/embedded.mobileprovision cp "$MOBILEPROVISION" Payload/${APP_NAME}.app/embedded.mobileprovision

View File

@@ -32,7 +32,7 @@ index 77f219e55..53f5e0cc0 100644
- to="https://bsky.social/about/support/tos" - to="https://bsky.social/about/support/tos"
+ label={_(msg`syu.is Terms of Service`)} + label={_(msg`syu.is Terms of Service`)}
+ to="https://syu.is/about/support/tos" + to="https://syu.is/about/support/tos"
style={[a.text_md, a.leading_normal]}> style={[a.text_md, a.leading_snug]}>
- Bluesky Social Terms of Service - Bluesky Social Terms of Service
+ syu.is Terms of Service + syu.is Terms of Service
</SimpleInlineLinkText> </SimpleInlineLinkText>

View File

@@ -1,17 +1,22 @@
diff --git a/src/ageAssurance/index.tsx b/src/ageAssurance/index.tsx diff --git a/src/ageAssurance/index.tsx b/src/ageAssurance/index.tsx
index 9a0a9c9d5..5a6563e52 100644
--- a/src/ageAssurance/index.tsx --- a/src/ageAssurance/index.tsx
+++ b/src/ageAssurance/index.tsx +++ b/src/ageAssurance/index.tsx
@@ -88,19 +88,16 @@ function InnerProvider({children}: {children: React.ReactNode}) { @@ -90,25 +90,16 @@ function InnerProvider({children}: {children: React.ReactNode}) {
return ( return (
<AgeAssuranceStateContext.Provider <AgeAssuranceStateContext.Provider
value={useMemo(() => { value={useMemo(() => {
- const chatDisabled = state.access !== AgeAssuranceAccess.Full - const chatDisabled = state.access !== AgeAssuranceAccess.Full
- const isUnderage = data?.birthdate - const isUnderAdultAge = data?.birthdate
- ? isUserUnderAdultAge(data.birthdate) - ? isUnderAge(data.birthdate, 18)
- : true - : true
- const isOverRegionMinAccessAge = data?.birthdate
- ? !isUnderAge(data.birthdate, config.minAccessAge)
- : false
- const isOverAppMinAccessAge = data?.birthdate
- ? !isUnderAge(data.birthdate, MIN_ACCESS_AGE)
- : false
- const adultContentDisabled = - const adultContentDisabled =
- state.access !== AgeAssuranceAccess.Full || isUnderage - state.access !== AgeAssuranceAccess.Full || isUnderAdultAge
return { return {
Access: AgeAssuranceAccess, Access: AgeAssuranceAccess,
Status: AgeAssuranceStatus, Status: AgeAssuranceStatus,
@@ -23,8 +28,12 @@ index 9a0a9c9d5..5a6563e52 100644
flags: { flags: {
- adultContentDisabled, - adultContentDisabled,
- chatDisabled, - chatDisabled,
- isOverRegionMinAccessAge,
- isOverAppMinAccessAge,
+ adultContentDisabled: false, + adultContentDisabled: false,
+ chatDisabled: false, + chatDisabled: false,
+ isOverRegionMinAccessAge: true,
+ isOverAppMinAccessAge: true,
}, },
} }
}, [state, data])}> }, [state, data, config])}>

View File

@@ -1,21 +1,35 @@
diff --git a/src/screens/Signup/StepInfo/index.tsx b/src/screens/Signup/StepInfo/index.tsx
--- a/src/screens/Signup/StepInfo/index.tsx --- a/src/screens/Signup/StepInfo/index.tsx
+++ b/src/screens/Signup/StepInfo/index.tsx +++ b/src/screens/Signup/StepInfo/index.tsx
@@ -7,11 +7,9 @@ @@ -9,44 +9,17 @@
import {isEmailMaybeInvalid} from '#/lib/strings/email'
import {logger} from '#/logger' import {logger} from '#/logger'
-import {is13, is18, useSignupContext} from '#/screens/Signup/state' import {isNative} from '#/platform/detection'
+import {useSignupContext} from '#/screens/Signup/state' import {useSignupContext} from '#/screens/Signup/state'
import {Policies} from '#/screens/Signup/StepInfo/Policies' -import {Policies} from '#/screens/Signup/StepInfo/Policies'
import {atoms as a, native} from '#/alf' import {atoms as a, native} from '#/alf'
-import * as Admonition from '#/components/Admonition'
-import * as Dialog from '#/components/Dialog'
-import {DeviceLocationRequestDialog} from '#/components/dialogs/DeviceLocationRequestDialog'
-import * as DateField from '#/components/forms/DateField' -import * as DateField from '#/components/forms/DateField'
-import {type DateFieldRef} from '#/components/forms/DateField/types' -import {type DateFieldRef} from '#/components/forms/DateField/types'
import {FormError} from '#/components/forms/FormError' import {FormError} from '#/components/forms/FormError'
import {HostingProvider} from '#/components/forms/HostingProvider' import {HostingProvider} from '#/components/forms/HostingProvider'
import * as TextField from '#/components/forms/TextField' import * as TextField from '#/components/forms/TextField'
@@ -22,16 +20,6 @@ import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope'
import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock'
import {Ticket_Stroke2_Corner0_Rounded as Ticket} from '#/components/icons/Ticket'
-import {createStaticClick, SimpleInlineLinkText} from '#/components/Link'
import {Loader} from '#/components/Loader'
import {usePreemptivelyCompleteActivePolicyUpdate} from '#/components/PolicyUpdateOverlay/usePreemptivelyCompleteActivePolicyUpdate' import {usePreemptivelyCompleteActivePolicyUpdate} from '#/components/PolicyUpdateOverlay/usePreemptivelyCompleteActivePolicyUpdate'
-import * as Toast from '#/components/Toast'
-import {
- isUnderAge,
- MIN_ACCESS_AGE,
- useAgeAssuranceRegionConfigWithFallback,
-} from '#/ageAssurance/util'
-import {
- useDeviceGeolocationApi,
- useIsDeviceGeolocationGranted,
-} from '#/geolocation'
import {BackNextButtons} from '../BackNextButtons' import {BackNextButtons} from '../BackNextButtons'
-function sanitizeDate(date: Date): Date { -function sanitizeDate(date: Date): Date {
@@ -31,26 +45,40 @@ diff --git a/src/screens/Signup/StepInfo/index.tsx b/src/screens/Signup/StepInfo
export function StepInfo({ export function StepInfo({
onPressBack, onPressBack,
isServerError, isServerError,
@@ -55,7 +43,6 @@ @@ -70,21 +43,6 @@
const emailInputRef = useRef<TextInput>(null) const emailInputRef = useRef<TextInput>(null)
const passwordInputRef = useRef<TextInput>(null) const passwordInputRef = useRef<TextInput>(null)
- const birthdateInputRef = useRef<DateFieldRef>(null) - const birthdateInputRef = useRef<DateFieldRef>(null)
-
- const aaRegionConfig = useAgeAssuranceRegionConfigWithFallback()
- const {setDeviceGeolocation} = useDeviceGeolocationApi()
- const locationControl = Dialog.useDialogControl()
- const isOverRegionMinAccessAge = state.dateOfBirth
- ? !isUnderAge(state.dateOfBirth.toISOString(), aaRegionConfig.minAccessAge)
- : true
- const isOverAppMinAccessAge = state.dateOfBirth
- ? !isUnderAge(state.dateOfBirth.toISOString(), MIN_ACCESS_AGE)
- : true
- const isOverMinAdultAge = state.dateOfBirth
- ? !isUnderAge(state.dateOfBirth.toISOString(), 18)
- : true
- const isDeviceGeolocationGranted = useIsDeviceGeolocationGranted()
const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false) const [hasWarnedEmail, setHasWarnedEmail] = React.useState<boolean>(false)
@@ -76,10 +63,6 @@ @@ -105,10 +63,6 @@
const emailChanged = prevEmailValueRef.current !== email const emailChanged = prevEmailValueRef.current !== email
const password = passwordValueRef.current const password = passwordValueRef.current
- if (!is13(state.dateOfBirth)) { - if (!isOverRegionMinAccessAge) {
- return - return
- } - }
- -
if (state.serviceDescription?.inviteCodeRequired && !inviteCode) { if (state.serviceDescription?.inviteCodeRequired && !inviteCode) {
return dispatch({ return dispatch({
type: 'setError', type: 'setError',
@@ -246,44 +229,21 @@ @@ -275,107 +229,16 @@
secureTextEntry secureTextEntry
autoComplete="new-password" autoComplete="new-password"
autoCapitalize="none" autoCapitalize="none"
@@ -83,18 +111,79 @@ diff --git a/src/screens/Signup/StepInfo/index.tsx b/src/screens/Signup/StepInfo
- maximumDate={new Date()} - maximumDate={new Date()}
- /> - />
- </View> - </View>
<Policies -
serviceDescription={state.serviceDescription} - <View style={[a.gap_sm]}>
- needsGuardian={!is18(state.dateOfBirth)} - <Policies serviceDescription={state.serviceDescription} />
- under13={!is13(state.dateOfBirth)} -
+ needsGuardian={false} - {!isOverRegionMinAccessAge || !isOverAppMinAccessAge ? (
+ under13={false} - <Admonition.Outer type="error">
/> - <Admonition.Row>
- <Admonition.Icon />
- <Admonition.Content>
- <Admonition.Text>
- {!isOverAppMinAccessAge ? (
- <Trans>
- You must be {MIN_ACCESS_AGE} years of age or older
- to create an account.
- </Trans>
- ) : (
- <Trans>
- You must be {aaRegionConfig.minAccessAge} years of
- age or older to create an account in your region.
- </Trans>
- )}
- </Admonition.Text>
- {isNative &&
- !isDeviceGeolocationGranted &&
- isOverAppMinAccessAge && (
- <Admonition.Text>
- <Trans>
- Have we got your location wrong?{' '}
- <SimpleInlineLinkText
- label={_(
- msg`Tap here to confirm your location with GPS.`,
- )}
- {...createStaticClick(() => {
- locationControl.open()
- })}>
- Tap here to confirm your location with GPS.
- </SimpleInlineLinkText>
- </Trans>
- </Admonition.Text>
- )}
- </Admonition.Content>
- </Admonition.Row>
- </Admonition.Outer>
- ) : !isOverMinAdultAge ? (
- <Admonition.Admonition type="warning">
- <Trans>
- If you are not yet an adult according to the laws of your
- country, your parent or legal guardian must read these Terms
- on your behalf.
- </Trans>
- </Admonition.Admonition>
- ) : undefined}
- </View>
-
- {isNative && (
- <DeviceLocationRequestDialog
- control={locationControl}
- onLocationAcquired={props => {
- props.closeDialog(() => {
- // set this after close!
- setDeviceGeolocation(props.geolocation)
- Toast.show(_(msg`Your location has been updated.`), {
- type: 'success',
- })
- })
- }}
- />
- )}
</> </>
) : undefined} ) : undefined}
</View> </View>
<BackNextButtons <BackNextButtons
- hideNext={!is13(state.dateOfBirth)} - hideNext={!isOverRegionMinAccessAge}
+ hideNext={false} + hideNext={false}
showRetry={isServerError} showRetry={isServerError}
isLoading={state.isLoading} isLoading={state.isLoading}

View File

@@ -70,8 +70,6 @@ npx expo prebuild --platform ios --clean
# 3. CocoaPods # 3. CocoaPods
echo "3. Installing CocoaPods..." echo "3. Installing CocoaPods..."
# Ensure PATH includes Homebrew ruby gems if needed
export PATH="/opt/homebrew/lib/ruby/gems/3.4.0/bin:$PATH"
cd ios cd ios
pod install pod install
cd .. cd ..