Defry the fish (#125)

Co-authored-by: Luna <luna.dragon@suse.com>
Reviewed-on: https://iceshrimp.dev/iceshrimp/iceshrimp/pulls/125
Co-authored-by: Luna D Dragon <lunarequest@nullrequest.com>
Co-committed-by: Luna D Dragon <lunarequest@nullrequest.com>
This commit is contained in:
Luna D Dragon 2023-08-21 16:14:53 +02:00 committed by Laura Hausmann
parent e3131e9b11
commit 91b8b7b76b
Signed by: zotan
GPG key ID: D044E84C5BE01605
93 changed files with 364 additions and 373 deletions

View file

@ -1,4 +1,5 @@
Copyright 2023 Firefish
Copyright 2023 The Iceshrimp contributors
Copyright 2023 The Firefish contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View file

@ -8,7 +8,7 @@ resources:
cpu: 1
memory: 1Gi
firefish:
iceshrimp:
domain: example.tld
smtp:
from_address: noreply@example.tld

View file

@ -1,3 +1,3 @@
[weblate]
url = https://hosted.weblate.org/api/
translation = firefish/locales
translation = iceshrimp/locales

View file

@ -2,7 +2,7 @@ pipeline:
publish-docker-latest:
image: plugins/kaniko
settings:
repo: thatonecalculator/firefish
repo: iceshrimp/iceshrimp
tags: latest
dockerfile: Dockerfile
username:

View file

@ -2,7 +2,7 @@ pipeline:
publish-docker-latest:
image: plugins/kaniko
settings:
repo: thatonecalculator/firefish
repo: iceshrimp/iceshrimp
tags: rc
dockerfile: Dockerfile
username:

View file

@ -2,7 +2,7 @@ pipeline:
publish-docker-tag:
image: plugins/kaniko
settings:
repo: thatonecalculator/firefish
repo: iceshrimp/iceshrimp
# Uses the tag from git for the container tag
tags: ${CI_COMMIT_TAG}
dockerfile: Dockerfile

View file

@ -2,7 +2,7 @@ pipeline:
docker-build:
image: plugins/kaniko
settings:
repo: thatonecalculator/firefish
repo: iceshrimp/iceshrimp
tags: test
dockerfile: Dockerfile
no_push: true

View file

@ -1,6 +1,6 @@
# Changelog
All changes from v13.0.0 onwards, for a list of differences read FIREFISH.md
All changes from v13.0.0 onwards, for a list of differences read CHANGES_FROM_UPSTREAM.md
## [1.0.0] - 2023-07-19

View file

@ -85,7 +85,7 @@
- Undo renote button inside original note
- Custom locales
- Obliteration of Ai-chan
- Switch to [Firefish.js](https://codeberg.org/firefish/firefish.js)
- Switch to [Iceshrimp.js](https://iceshrimp.dev/iceshrimp/iceshrimp/)
- Woozy mode 🥴
- Improve blocking servers
- Release notes

View file

@ -60,10 +60,7 @@ representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
@thatonecalculator on Codeberg,
`@kainoa@firefish.social` on the Fediverse,
or kainoa@t1c.dev via email.
reported to the community leaders responsible for enforcement at `conduct@iceshrimp.dev`.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the

View file

@ -1,26 +1,24 @@
# Contribution guide
We're glad you're interested in contributing Firefish! In this document you will find the information you need to contribute to the project.
We're glad you're interested in contributing Iceshrimp! In this document you will find the information you need to contribute to the project.
## Translation (i18n)
Firefish uses [Weblate](hhttps://hosted.weblate.org/engage/firefish/) for translation and internationalization management.
Iceshrimp uses [Weblate](https://translate.iceshrimp.dev/) for translation and internationalization management.
If your language is not listed in Weblate, please open an issue.
You can contribute without knowing how to code by helping translate here:
[![Translation status](https://hosted.weblate.org/widgets/firefish/-/287x66-grey.png)](https://hosted.weblate.org/engage/firefish/)
[![Translation status](https://translate.iceshrimp.dev/widgets/iceshrimp/-/287x66-grey.png)](https://translate.iceshrimp.dev/)
[![Translation bars](https://hosted.weblate.org/widgets/firefish/-/multi-auto.svg)](https://hosted.weblate.org/engage/firefish/)
[![Translation bars](https://translate.iceshrimp.dev/widgets/iceshrimp/-/multi-auto.svg)](https://translate.iceshrimp.dev/)
## Roadmap
See [FIREFISH.md](./FIREFISH.md)
## Issues
Before creating an issue, please check the following:
- To avoid duplication, please search for similar issues before creating a new issue.
- Do not use Issues to ask questions or troubleshooting.
- Issues should only be used to feature requests, suggestions, and bug tracking.
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#firefish:matrix.fedibird.com).
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#iceshrimp-dev:161.rocks).
> **Warning**
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.

View file

@ -18,7 +18,7 @@ And are distributed under The Apache License, Version 2.0, you should have recei
---
Firefish includes several third-party open-source softwares and software libraries.
Iceshrimp includes several third-party open-source softwares and software libraries.
RsaSignature2017 implementation by Transmute Industries Inc
License: MIT

View file

@ -1,16 +1,11 @@
# Reporting Security Issues
## Minor Security Issues
If you discover a minor security issue in Firefish, please report it by sending an
email to [kainoa@t1c.dev](mailto:kainoa@t1c.dev).
## High Security Issues
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using kainoa@t1c.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @t1c:matrix.fedibird.com or @cleo:tchncs.de
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using security@iceshrimp.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @zotan:161.rocks
This will allow us to assess the risk, and make a fix available before we add a
bug report to the Codeberg repository.
Thanks for helping make Firefish safe for everyone.
Thanks for helping make Iceshrimp safe for everyone.

View file

@ -1,6 +1,6 @@
apiVersion: v2
name: firefish
description: A fun, new, open way to experience social media https://joinfirefish.org
name: iceshrimp
description: A fun, new, open way to experience social media https://iceshrimp.dev
# A chart can be either an 'application' or a 'library' chart.
#

View file

@ -1,8 +1,8 @@
# firefish
# iceshrimp
![Version: 0.1.2](https://img.shields.io/badge/Version-0.1.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: rc](https://img.shields.io/badge/AppVersion-rc-informational?style=flat-square)
A fun, new, open way to experience social media https://joinfirefish.org
A fun, new, open way to experience social media https://iceshrimp.dev
## Requirements
@ -21,39 +21,39 @@ A fun, new, open way to experience social media https://joinfirefish.org
| autoscaling.maxReplicas | int | `100` | |
| autoscaling.minReplicas | int | `1` | |
| autoscaling.targetCPUUtilizationPercentage | int | `80` | |
| firefish.allowedPrivateNetworks | list | `[]` | If you want to allow firefish to connect to private ips, enter the cidrs here. |
| firefish.deepl.authKey | string | `""` | |
| firefish.deepl.isPro | bool | `false` | |
| firefish.deepl.managed | bool | `false` | |
| firefish.domain | string | `"firefish.local"` | |
| firefish.isManagedHosting | bool | `true` | |
| firefish.libreTranslate.apiKey | string | `""` | |
| firefish.libreTranslate.apiUrl | string | `""` | |
| firefish.libreTranslate.managed | bool | `false` | |
| firefish.objectStorage.access_key | string | `""` | |
| firefish.objectStorage.access_secret | string | `""` | |
| firefish.objectStorage.baseUrl | string | `""` | |
| firefish.objectStorage.bucket | string | `""` | |
| firefish.objectStorage.endpoint | string | `""` | |
| firefish.objectStorage.managed | bool | `true` | |
| firefish.objectStorage.prefix | string | `"files"` | |
| firefish.objectStorage.region | string | `""` | |
| firefish.reservedUsernames[0] | string | `"root"` | |
| firefish.reservedUsernames[1] | string | `"admin"` | |
| firefish.reservedUsernames[2] | string | `"administrator"` | |
| firefish.reservedUsernames[3] | string | `"me"` | |
| firefish.reservedUsernames[4] | string | `"system"` | |
| firefish.smtp.from_address | string | `"notifications@example.com"` | |
| firefish.smtp.login | string | `""` | |
| firefish.smtp.managed | bool | `true` | |
| firefish.smtp.password | string | `""` | |
| firefish.smtp.port | int | `587` | |
| firefish.smtp.server | string | `"smtp.mailgun.org"` | |
| firefish.smtp.useImplicitSslTls | bool | `false` | |
| iceshrimp.allowedPrivateNetworks | list | `[]` | If you want to allow iceshrimp to connect to private ips, enter the cidrs here. |
| iceshrimp.deepl.authKey | string | `""` | |
| iceshrimp.deepl.isPro | bool | `false` | |
| iceshrimp.deepl.managed | bool | `false` | |
| iceshrimp.domain | string | `"iceshrimp.local"` | |
| iceshrimp.isManagedHosting | bool | `true` | |
| iceshrimp.libreTranslate.apiKey | string | `""` | |
| iceshrimp.libreTranslate.apiUrl | string | `""` | |
| iceshrimp.libreTranslate.managed | bool | `false` | |
| iceshrimp.objectStorage.access_key | string | `""` | |
| iceshrimp.objectStorage.access_secret | string | `""` | |
| iceshrimp.objectStorage.baseUrl | string | `""` | |
| iceshrimp.objectStorage.bucket | string | `""` | |
| iceshrimp.objectStorage.endpoint | string | `""` | |
| iceshrimp.objectStorage.managed | bool | `true` | |
| iceshrimp.objectStorage.prefix | string | `"files"` | |
| iceshrimp.objectStorage.region | string | `""` | |
| iceshrimp.reservedUsernames[0] | string | `"root"` | |
| iceshrimp.reservedUsernames[1] | string | `"admin"` | |
| iceshrimp.reservedUsernames[2] | string | `"administrator"` | |
| iceshrimp.reservedUsernames[3] | string | `"me"` | |
| iceshrimp.reservedUsernames[4] | string | `"system"` | |
| iceshrimp.smtp.from_address | string | `"notifications@example.com"` | |
| iceshrimp.smtp.login | string | `""` | |
| iceshrimp.smtp.managed | bool | `true` | |
| iceshrimp.smtp.password | string | `""` | |
| iceshrimp.smtp.port | int | `587` | |
| iceshrimp.smtp.server | string | `"smtp.mailgun.org"` | |
| iceshrimp.smtp.useImplicitSslTls | bool | `false` | |
| elasticsearch | object | `{"auth":{},"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters |
| fullnameOverride | string | `""` | |
| image.pullPolicy | string | `"IfNotPresent"` | |
| image.repository | string | `"docker.io/thatonecalculator/firefish"` | |
| image.repository | string | `"iceshrimp.dev/iceshrimp/iceshrimp"` | |
| image.tag | string | `""` | |
| imagePullSecrets | list | `[]` | |
| ingress.annotations | object | `{}` | |
@ -67,9 +67,9 @@ A fun, new, open way to experience social media https://joinfirefish.org
| nodeSelector | object | `{}` | |
| podAnnotations | object | `{}` | |
| podSecurityContext | object | `{}` | |
| postgresql.auth.database | string | `"firefish_production"` | |
| postgresql.auth.database | string | `"iceshrimp_production"` | |
| postgresql.auth.password | string | `""` | |
| postgresql.auth.username | string | `"firefish"` | |
| postgresql.auth.username | string | `"iceshrimp"` | |
| postgresql.enabled | bool | `true` | disable if you want to use an existing db; in which case the values below must match those of that external postgres instance |
| redis.auth.password | string | `""` | you must set a password; the password generated by the redis chart will be rotated on each upgrade: |
| redis.enabled | bool | `true` | |

View file

@ -6,16 +6,16 @@
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "firefish.fullname" . }})
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "iceshrimp.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "firefish.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "firefish.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "iceshrimp.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "iceshrimp.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "firefish.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "iceshrimp.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT

View file

@ -1,7 +1,7 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "firefish.name" -}}
{{- define "iceshrimp.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
@ -10,7 +10,7 @@ Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "firefish.fullname" -}}
{{- define "iceshrimp.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
@ -26,16 +26,16 @@ If release name contains chart name it will be used as a full name.
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "firefish.chart" -}}
{{- define "iceshrimp.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "firefish.labels" -}}
helm.sh/chart: {{ include "firefish.chart" . }}
{{ include "firefish.selectorLabels" . }}
{{- define "iceshrimp.labels" -}}
helm.sh/chart: {{ include "iceshrimp.chart" . }}
{{ include "iceshrimp.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
@ -45,17 +45,17 @@ app.kubernetes.io/managed-by: {{ .Release.Service }}
{{/*
Selector labels
*/}}
{{- define "firefish.selectorLabels" -}}
app.kubernetes.io/name: {{ include "firefish.name" . }}
{{- define "iceshrimp.selectorLabels" -}}
app.kubernetes.io/name: {{ include "iceshrimp.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "firefish.serviceAccountName" -}}
{{- define "iceshrimp.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "firefish.fullname" .) .Values.serviceAccount.name }}
{{- default (include "iceshrimp.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
@ -65,31 +65,31 @@ Create the name of the service account to use
Create a default fully qualified name for dependent services.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "firefish.elasticsearch.fullname" -}}
{{- define "iceshrimp.elasticsearch.fullname" -}}
{{- printf "%s-%s" .Release.Name "elasticsearch" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "firefish.redis.fullname" -}}
{{- define "iceshrimp.redis.fullname" -}}
{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "firefish.postgresql.fullname" -}}
{{- define "iceshrimp.postgresql.fullname" -}}
{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
config/default.yml content
*/}}
{{- define "firefish.configDir.default.yml" -}}
{{- define "iceshrimp.configDir.default.yml" -}}
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Firefish configuration
# iceshrimp configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
url: "https://{{ .Values.firefish.domain }}/"
url: "https://{{ .Values.iceshrimp.domain }}/"
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
@ -118,7 +118,7 @@ port: 3000
db:
{{- if .Values.postgresql.enabled }}
host: {{ template "firefish.postgresql.fullname" . }}
host: {{ template "iceshrimp.postgresql.fullname" . }}
port: '5432'
{{- else }}
host: {{ .Values.postgresql.postgresqlHostname }}
@ -146,7 +146,7 @@ db:
redis:
{{- if .Values.redis.enabled }}
host: {{ template "firefish.redis.fullname" . }}-master
host: {{ template "iceshrimp.redis.fullname" . }}-master
{{- else }}
host: {{ required "When the redis chart is disabled .Values.redis.hostname is required" .Values.redis.hostname }}
{{- end }}
@ -218,7 +218,7 @@ id: 'aid'
# Reserved usernames that only the administrator can register with
reservedUsernames:
{{ .Values.firefish.reservedUsernames | toYaml }}
{{ .Values.iceshrimp.reservedUsernames | toYaml }}
# Whether disable HSTS
#disableHsts: true
@ -266,7 +266,7 @@ reservedUsernames:
#proxyRemoteFiles: true
allowedPrivateNetworks:
{{ .Values.firefish.allowedPrivateNetworks | toYaml }}
{{ .Values.iceshrimp.allowedPrivateNetworks | toYaml }}
# TWA
#twa:
@ -286,34 +286,34 @@ allowedPrivateNetworks:
# If you mess this up, that's on you, you've been warned...
#maxUserSignups: 100
isManagedHosting: {{ .Values.firefish.isManagedHosting }}
isManagedHosting: {{ .Values.iceshrimp.isManagedHosting }}
deepl:
managed: {{ .Values.firefish.deepl.managed }}
authKey: {{ .Values.firefish.deepl.authKey | quote}}
isPro: {{ .Values.firefish.deepl.isPro }}
managed: {{ .Values.iceshrimp.deepl.managed }}
authKey: {{ .Values.iceshrimp.deepl.authKey | quote}}
isPro: {{ .Values.iceshrimp.deepl.isPro }}
libreTranslate:
managed: {{ .Values.firefish.libreTranslate.managed }}
apiUrl: {{ .Values.firefish.libreTranslate.apiUrl | quote }}
apiKey: {{ .Values.firefish.libreTranslate.apiKey | quote }}
managed: {{ .Values.iceshrimp.libreTranslate.managed }}
apiUrl: {{ .Values.iceshrimp.libreTranslate.apiUrl | quote }}
apiKey: {{ .Values.iceshrimp.libreTranslate.apiKey | quote }}
email:
managed: {{ .Values.firefish.smtp.managed }}
address: {{ .Values.firefish.smtp.from_address | quote }}
host: {{ .Values.firefish.smtp.server | quote }}
port: {{ .Values.firefish.smtp.port }}
user: {{ .Values.firefish.smtp.login | quote }}
pass: {{ .Values.firefish.smtp.password | quote }}
useImplicitSslTls: {{ .Values.firefish.smtp.useImplicitSslTls }}
managed: {{ .Values.iceshrimp.smtp.managed }}
address: {{ .Values.iceshrimp.smtp.from_address | quote }}
host: {{ .Values.iceshrimp.smtp.server | quote }}
port: {{ .Values.iceshrimp.smtp.port }}
user: {{ .Values.iceshrimp.smtp.login | quote }}
pass: {{ .Values.iceshrimp.smtp.password | quote }}
useImplicitSslTls: {{ .Values.iceshrimp.smtp.useImplicitSslTls }}
objectStorage:
managed: {{ .Values.firefish.objectStorage.managed }}
baseUrl: {{ .Values.firefish.objectStorage.baseUrl | quote }}
bucket: {{ .Values.firefish.objectStorage.bucket | quote }}
prefix: {{ .Values.firefish.objectStorage.prefix | quote }}
endpoint: {{ .Values.firefish.objectStorage.endpoint | quote }}
region: {{ .Values.firefish.objectStorage.region | quote }}
accessKey: {{ .Values.firefish.objectStorage.access_key | quote }}
secretKey: {{ .Values.firefish.objectStorage.access_secret | quote }}
managed: {{ .Values.iceshrimp.objectStorage.managed }}
baseUrl: {{ .Values.iceshrimp.objectStorage.baseUrl | quote }}
bucket: {{ .Values.iceshrimp.objectStorage.bucket | quote }}
prefix: {{ .Values.iceshrimp.objectStorage.prefix | quote }}
endpoint: {{ .Values.iceshrimp.objectStorage.endpoint | quote }}
region: {{ .Values.iceshrimp.objectStorage.region | quote }}
accessKey: {{ .Values.iceshrimp.objectStorage.access_key | quote }}
secretKey: {{ .Values.iceshrimp.objectStorage.access_secret | quote }}
useSsl: true
connnectOverProxy: false
setPublicReadOnUpload: true

View file

@ -1,16 +1,16 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "firefish.fullname" . }}
name: {{ include "iceshrimp.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "firefish.selectorLabels" . | nindent 6 }}
{{- include "iceshrimp.selectorLabels" . | nindent 6 }}
template:
metadata:
annotations:
@ -19,19 +19,19 @@ spec:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "firefish.selectorLabels" . | nindent 8 }}
{{- include "iceshrimp.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "firefish.serviceAccountName" . }}
serviceAccountName: {{ include "iceshrimp.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
volumes:
- name: config-volume
secret:
secretName: {{ template "firefish.fullname" . }}-config
secretName: {{ template "iceshrimp.fullname" . }}-config
containers:
- name: {{ .Chart.Name }}
securityContext:
@ -47,7 +47,7 @@ spec:
value: "production"
volumeMounts:
- name: config-volume
mountPath: /firefish/.config
mountPath: /iceshrimp/.config
ports:
- name: http
containerPort: 3000

View file

@ -2,14 +2,14 @@
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "firefish.fullname" . }}
name: {{ include "iceshrimp.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "firefish.fullname" . }}
name: {{ include "iceshrimp.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:

View file

@ -1,5 +1,5 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "firefish.fullname" . -}}
{{- $fullName := include "iceshrimp.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
@ -17,7 +17,7 @@ kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}

View file

@ -1,9 +1,9 @@
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "firefish.fullname" . }}-db-migrate
name: {{ include "iceshrimp.fullname" . }}-db-migrate
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": post-install,pre-upgrade
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
@ -11,7 +11,7 @@ metadata:
spec:
template:
metadata:
name: {{ include "firefish.fullname" . }}-db-migrate
name: {{ include "iceshrimp.fullname" . }}-db-migrate
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
@ -22,13 +22,13 @@ spec:
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "firefish.serviceAccountName" . }}
serviceAccountName: {{ include "iceshrimp.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
volumes:
- name: config-volume
secret:
secretName: {{ template "firefish.fullname" . }}-config
secretName: {{ template "iceshrimp.fullname" . }}-config
containers:
- name: {{ .Chart.Name }}
securityContext:
@ -44,7 +44,7 @@ spec:
value: "production"
volumeMounts:
- name: config-volume
mountPath: /firefish/.config
mountPath: /iceshrimp/.config
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}

View file

@ -1,9 +1,9 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ template "firefish.fullname" . }}-config
name: {{ template "iceshrimp.fullname" . }}-config
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
type: Opaque
data:
default.yml: {{ include "firefish.configDir.default.yml" . | b64enc }}
default.yml: {{ include "iceshrimp.configDir.default.yml" . | b64enc }}

View file

@ -1,9 +1,9 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "firefish.fullname" . }}
name: {{ include "iceshrimp.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
@ -12,4 +12,4 @@ spec:
protocol: TCP
name: http
selector:
{{- include "firefish.selectorLabels" . | nindent 4 }}
{{- include "iceshrimp.selectorLabels" . | nindent 4 }}

View file

@ -2,9 +2,9 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "firefish.serviceAccountName" . }}
name: {{ include "iceshrimp.serviceAccountName" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}

View file

@ -1,9 +1,9 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "firefish.fullname" . }}-test-connection"
name: "{{ include "iceshrimp.fullname" . }}-test-connection"
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- include "iceshrimp.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
@ -11,5 +11,5 @@ spec:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "firefish.fullname" . }}:{{ .Values.service.port }}']
args: ['{{ include "iceshrimp.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

View file

@ -1,18 +1,18 @@
# Default values for firefish.
# Default values for iceshrimp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: docker.io/thatonecalculator/firefish
repository: docker.io/thatonecalculator/iceshrimp
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
firefish:
iceshrimp:
isManagedHosting: true
domain: firefish.local
domain: iceshrimp.local
deepl:
managed: false
@ -43,7 +43,7 @@ firefish:
endpoint: "" # e.g. "nyc3.digitaloceanspaces.com:443"
region: "" # e.g. "nyc3"
# -- If you want to allow firefish to connect to private ips, enter the cidrs here.
# -- If you want to allow iceshrimp to connect to private ips, enter the cidrs here.
allowedPrivateNetworks: []
# - "10.0.0.0/8"
@ -62,8 +62,8 @@ postgresql:
# postgresqlHostname: preexisting-postgresql
# postgresqlPort: 5432
auth:
database: firefish_production
username: firefish
database: iceshrimp_production
username: iceshrimp
# you must set a password; the password generated by the postgresql chart will
# be rotated on each upgrade:
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#upgrade

View file

@ -4,7 +4,7 @@
# changelog header
header = """
# Changelog\n
All changes from v13.0.0 onwards, for a list of differences read FIREFISH.md\n
All changes from v13.0.0 onwards, for a list of differences read CHANGES_FROM_UPSTREAM.md\n
"""
# template for the changelog body
# https://tera.netlify.app/docs/#introduction

View file

@ -1,4 +1,4 @@
Copyright 2023 Firefish
Copyright 2023 The Iceshrimp contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View file

@ -2,9 +2,9 @@ version: "3"
services:
web:
image: docker.io/thatonecalculator/firefish
image: iceshrimp.dev/iceshrimp/iceshrimp:dev
build: ..
container_name: firefish_web
container_name: iceshrimp_web
restart: always
depends_on:
- db
@ -16,12 +16,12 @@ services:
- network
# - web
volumes:
- ../files:/firefish/files
- ../.config:/firefish/.config:ro
- ../files:/iceshrimp/files
- ../.config:/iceshrimp/.config:ro
redis:
restart: always
container_name: firefish_redis
container_name: iceshrimp_redis
image: docker.io/redis:7.0-alpine
networks:
- network
@ -31,7 +31,7 @@ services:
db:
restart: always
image: docker.io/postgres:12.2-alpine
container_name: firefish_db
container_name: iceshrimp_db
networks:
- network
env_file:

View file

@ -1,5 +1,5 @@
# API Documentation
You can find interactive API documentation at any Firefish instance. https://firefish.social/api-doc
You can find interactive API documentation at any Iceshrimp instance. https://iceshrimp.social/api-doc
You can also find auto-generated documentation for iceshrimp-js [here](../packages/iceshrimp-js/markdown/iceshrimp-js.md).

View file

@ -1,7 +1,7 @@
# 🌎 Firefish Developer Docs
# 🌎 Iceshrimp Developer Docs
## Nix Dev Environment
The Firefish repo comes with a Nix-based shell environment to help make development as easy as possible!
The Iceshrimp repo comes with a Nix-based shell environment to help make development as easy as possible!
Please note, however, that this environment will not work on Windows outside of a WSL2 environment.
@ -10,12 +10,12 @@ Please note, however, that this environment will not work on Windows outside of
- Installed the [Nix Package Manager](https://nixos.org/download.html) (use the comman on their website)
- Installed [direnv](https://direnv.net/docs/installation.html) and added its hook to your shell. (package manager)
Once the repo is cloned to your computer, follow these next few steps inside the Firefish folder:
Once the repo is cloned to your computer, follow these next few steps inside the Iceshrimp folder:
- Run `direnv allow`. This will build the environment and install all needed tools.
- Run `install-deps`, then `prepare-config`, to install the node dependencies and prepare the needed config files.
- In a second terminal, run `devenv up`. This will spawn a **Redis** server, a **Postgres** server, and the **Firefish** server in dev mode.
- Once you see the Firefish banner printed in your second terminal, run `migrate` in the first.
- In a second terminal, run `devenv up`. This will spawn a **Redis** server, a **Postgres** server, and the **Iceshrimp** server in dev mode.
- Once you see the Iceshrimp banner printed in your second terminal, run `migrate` in the first.
- Once migrations finish, open http://localhost:3000 in your web browser.
- You should now see the admin user creation screen!
@ -40,7 +40,7 @@ delete `flake.lock`, or better, run `nix flake update --extra-experimental-featu
after that, run `direnv rebuild`
if there are any errors, you might have to change `flake.nix`
(because the available options can change between versions - consider getting support in [the matrix channel](https://matrix.to/#/#firefish:matrix.fedibird.com))
(because the available options can change between versions - consider getting support in [the matrix channel](https://matrix.to/#/%23iceshrimp-dev:161.rocks))
### after changing a node version
in my case, i had to change the node version from 19, to 18
@ -66,18 +66,18 @@ devenv up may take a looong time. (some say this is fake news, maybe it was bad
do not get spooked by this error:
```
> firefish@14.0.0-dev32 start /mnt/.../firefish
> iceshrimp@14.0.0-dev32 start /mnt/.../iceshrimp
> pnpm --filter backend run start
> backend@ start /mnt/.../firefish/packages/backend
> backend@ start /mnt/.../iceshrimp/packages/backend
> pnpm node ./built/index.js
node:internal/modules/cjs/loader:1078
throw err;
^
Error: Cannot find module '/mnt/.../firefish/packages/backend/built/index.js'
Error: Cannot find module '/mnt/.../iceshrimp/packages/backend/built/index.js'
at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)
at Module._load (node:internal/modules/cjs/loader:920:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
@ -88,7 +88,7 @@ Error: Cannot find module '/mnt/.../firefish/packages/backend/built/index.js'
Node.js v18.16.0
undefined
/mnt/.../firefish/packages/backend:
/mnt/.../iceshrimp/packages/backend:
ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL backend@ start: `pnpm node ./built/index.js`
Exit status 1
ELIFECYCLE Command failed with exit code 1.
@ -97,7 +97,7 @@ Exit status 1
the script is designed to constantly try to start the server, while the build is still running.
this just means that the build isn't finished yet.
at some point you should see a banner that says "Firefish" in big letters -
at some point you should see a banner that says "Iceshrimp" in big letters -
then you're good to go and can run `migrate` (in another terminal)!
if you don't see the banner,

View file

@ -1,14 +1,14 @@
# 🐳 Running a Firefish server with Docker
# 🐳 Running a Iceshrimp server with Docker
## Pre-built docker container
[thatonecalculator/firefish](https://hub.docker.com/r/thatonecalculator/firefish)
[iceshrimp/iceshrimp](iceshrimp.dev/iceshrimp/iceshrimp)
## `docker-compose`
There is a `docker-compose.yml` in the root of the project that you can use to build the container from source
- .config/docker.env (**db config settings**)
- .config/default.yml (**firefish server settings**)
- .config/default.yml (**Iceshrimp server settings**)
## Configuring
@ -21,22 +21,22 @@ Rename the files:
then edit them according to your environment.
You can configure `docker.env` with anything you like, but you will have to pay attention to the `default.yml` file:
- `url` should be set to the URL you will be hosting the web interface for the server at.
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *firefish_db_1*), and the others should match your `docker.env`.
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *firefish_redis_1*)
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *iceshrimp_db_1*), and the others should match your `docker.env`.
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *iceshrimp_redis_1*)
- `auth` will need to be configured in the *Sonic* section - cannot be the default `SecretPassword`
Everything else can be left as-is.
## Running docker-compose
The [prebuilt container for firefish](https://hub.docker.com/r/thatonecalculator/firefish) is fairly large, and may take a few minutes to download and extract using docker.
The [prebuilt container for iceshrimp](https://iceshrimp.dev/iceshrimp/-/packages/container/iceshrimp/latest) is fairly large, and may take a few minutes to download and extract using docker.
Copy `docker-compose.yml` and the `config/` to a directory, then run the **docker-compose** command:
`docker-compose up -d`.
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the firefish tables.
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the Iceshrimp tables.
Once the server is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the firefish server on).
Once the server is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the Iceshrimp server on).
## Docker for development

View file

@ -1,7 +1,7 @@
# Running a Firefish server with Kubernetes and Helm
# Running a iceshrimp server with Kubernetes and Helm
This is a [Helm](https://helm.sh/) chart directory in the root of the project
that you can use to deploy firefish to a Kubernetes cluster
that you can use to deploy iceshrimp to a Kubernetes cluster
## Deployment
@ -17,29 +17,29 @@ helm dependency list $dir 2> /dev/null | tail +2 | head -n -1 | awk '{ print "he
cd ../
```
3. Create the firefish helm release (also used to update existing deployment):
3. Create the iceshrimp helm release (also used to update existing deployment):
```shell
helm upgrade \
--install \
--namespace firefish \
--namespace iceshrimp \
--create-namespace \
firefish chart/ \
iceshrimp chart/ \
-f .config/helm_values.yml
```
4. Watch your firefish server spin up:
4. Watch your iceshrimp server spin up:
```shell
kubectl -n firefish get po -w
kubectl -n iceshrimp get po -w
```
5. Initial the admin user and managed config:
```shell
export firefish_USERNAME="my_desired_admin_handle" && \
export firefish_PASSWORD="myDesiredInitialPassword" && \
export firefish_HOST="firefish.example.com" && \
export firefish_TOKEN=$(curl -X POST https://$firefish_HOST/api/admin/accounts/create -H "Content-Type: application/json" -d "{ \"username\":\"$firefish_USERNAME\", \"password\":\"$firefish_PASSWORD\" }" | jq -r '.token') && \
echo "Save this token: ${firefish_TOKEN}" && \
curl -X POST -H "Authorization: Bearer $firefish_TOKEN" https://$firefish_HOST/api/admin/accounts/hosted
export iceshrimp_USERNAME="my_desired_admin_handle" && \
export iceshrimp_PASSWORD="myDesiredInitialPassword" && \
export iceshrimp_HOST="iceshrimp.example.com" && \
export iceshrimp_TOKEN=$(curl -X POST https://$iceshrimp_HOST/api/admin/accounts/create -H "Content-Type: application/json" -d "{ \"username\":\"$iceshrimp_USERNAME\", \"password\":\"$iceshrimp_PASSWORD\" }" | jq -r '.token') && \
echo "Save this token: ${iceshrimp_TOKEN}" && \
curl -X POST -H "Authorization: Bearer $iceshrimp_TOKEN" https://$iceshrimp_HOST/api/admin/accounts/hosted
```
6. Enjoy!

View file

@ -1,4 +1,4 @@
# 🚚 Migrating from Misskey/FoundKey to Firefish
# 🚚 Migrating from Misskey/FoundKey to Iceshrimp
All the guides below assume you're starting in the root of the repo directory.
@ -14,8 +14,8 @@ Tested with Misskey v13.11.3.
If your Misskey v13 is older, we recommend updating your Misskey to v13.11.3.
```sh
wget -O mkv13.patch https://codeberg.org/firefish/firefish/raw/branch/develop/docs/mkv13.patch
wget -O mkv13_restore.patch https://codeberg.org/firefish/firefish/raw/branch/develop/docs/mkv13_restore.patch
wget -O mkv13.patch https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/docs/mkv13.patch
wget -O mkv13_restore.patch https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/docs/mkv13_restore.patch
git apply mkv13.patch mkv13_restore.patch
cd packages/backend
@ -27,13 +27,13 @@ for i in $(seq 1 $NUM_MIGRATIONS); do pnpm typeorm migration:revert -d ormconfig
cd ../../
git remote set-url origin https://codeberg.org/firefish/firefish.git
git remote set-url origin https://iceshrimp.dev/iceshrimp/iceshrimp.git
git fetch origin
git stash push
rm -rf fluent-emojis misskey-assets
git switch main # or beta or develop
git pull --ff
wget -O renote_muting.patch https://codeberg.org/firefish/firefish/raw/branch/develop/docs/renote_muting.patch
wget -O renote_muting.patch https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/docs/renote_muting.patch
git apply renote_muting.patch
pnpm install
@ -60,16 +60,16 @@ ALTER TABLE "instance" ADD COLUMN "latestStatus" character varying(512);
ALTER TABLE "instance" ADD COLUMN "lastCommunicatedAt" date;
```
then quit with `\q`, and restart Firefish.
then quit with `\q`, and restart Iceshrimp.
Note: Ignore errors of `column "xxx" of relation "xxx" already exists`.
If no other errors happened, your Firefish is ready to launch!
If no other errors happened, your Iceshrimp is ready to launch!
## Misskey v12.119 and before
```sh
git remote set-url origin https://codeberg.org/firefish/firefish.git
git remote set-url origin https://iceshrimp.dev/iceshrimp/iceshrimp.git
git fetch
git checkout main # or beta or develop
git pull --ff
@ -81,7 +81,7 @@ NODE_ENV=production pnpm run migrate
## FoundKey
```sh
wget -O fk.patch https://codeberg.org/firefish/firefish/raw/branch/develop/docs/fk.patch
wget -O fk.patch https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/docs/fk.patch
git apply fk.patch
cd packages/backend
@ -92,9 +92,9 @@ for i in $(seq 1 $NUM_MIGRATIONS); do
npx typeorm migration:revert -d ormconfig.js
done
git remote set-url origin https://codeberg.org/firefish/firefish.git
git remote set-url origin https://iceshrimp.dev/iceshrimp/iceshrimp.git
git fetch
git checkout main # or beta or develop
git checkout main # or dev
git pull --ff
NODE_ENV=production pnpm run migrate
@ -103,4 +103,4 @@ NODE_ENV=production pnpm run migrate
## Reverse
You ***cannot*** migrate back to Misskey from Firefish due to re-hashing passwords on signin with argon2. You can migrate from Calckey to FoundKey, although this is not recommended due to FoundKey being end-of-life, and may have some problems with alt-text.
You ***cannot*** migrate back to Misskey from Iceshrimp due to re-hashing passwords on signin with argon2. You can migrate from Iceshrimp to FoundKey, although this is not recommended due to FoundKey being end-of-life, and may have some problems with alt-text.

View file

@ -1,5 +1,5 @@
{
description = "Firefish development flake";
description = "Iceshrimp development flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";

View file

@ -1,6 +1,6 @@
# 📦 Packages
This directory contains all of the packages Firefish uses.
This directory contains all of the packages Iceshrimp uses.
- `backend`: Main backend code written in TypeScript for NodeJS
- `backend/native-utils`: Backend code written in Rust, bound to NodeJS by [NAPI-RS](https://napi.rs/)

View file

@ -1,4 +1,4 @@
Copyright 2023 Firefish
Copyright 2023 The Iceshrimp contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

BIN
packages/backend/assets/splash.svg (Stored with Git LFS)

Binary file not shown.

View file

@ -8,7 +8,7 @@ static CHAR_COLLECTION: &str = "0123456789abcdefghijklmnopqrstuvwxyz";
#[napi]
pub enum IdConvertType {
MastodonId,
FirefishId,
IceshrimpId,
}
#[napi]
@ -23,7 +23,7 @@ pub fn convert_id(in_id: String, id_convert_type: IdConvertType) -> napi::Result
Ok(out.to_string())
}
FirefishId => {
IceshrimpId => {
let mut input: i128 = match in_id.parse() {
Ok(s) => s,
Err(_) => {

View file

@ -53,7 +53,7 @@ export default function load() {
mixin.apiUrl = `${mixin.scheme}://${mixin.host}/api`;
mixin.authUrl = `${mixin.scheme}://${mixin.host}/auth`;
mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
mixin.userAgent = `Firefish/${meta.version} (${config.url})`;
mixin.userAgent = `Iceshrimp/${meta.version} (${config.url})`;
mixin.clientEntry = clientManifest["src/init.ts"];
if (!config.redis.prefix) config.redis.prefix = mixin.hostname;

View file

@ -18,8 +18,8 @@ export function metaToPugArgs(meta: Meta): object {
return {
img: meta.bannerUrl,
title: meta.name || "Firefish",
instanceName: meta.name || "Firefish",
title: meta.name || "Iceshrimp",
instanceName: meta.name || "Iceshrimp",
desc: meta.description,
icon: meta.iconUrl,
splashIcon: splashIconUrl,

View file

@ -436,14 +436,14 @@ export class Meta {
@Column("varchar", {
length: 512,
default: "https://codeberg.org/firefish/firefish",
default: "https://iceshrimp.dev/iceshrimp/iceshrimp",
nullable: false,
})
public repositoryUrl: string;
@Column("varchar", {
length: 512,
default: "https://codeberg.org/firefish/firefish/issues/new",
default: "https://iceshrimp.dev/iceshrimp/iceshrimp/issues/new",
nullable: true,
})
public feedbackUrl: string | null;

View file

@ -19,7 +19,7 @@ export const packedFederationInstanceSchema = {
type: "string",
optional: false,
nullable: false,
example: "firefish.example.com",
example: "iceshrimp.example.com",
},
accountDomain: {
type: "string",
@ -83,7 +83,7 @@ export const packedFederationInstanceSchema = {
type: "string",
optional: false,
nullable: true,
example: "firefish",
example: "iceshrimp",
},
softwareVersion: {
type: "string",

View file

@ -5,7 +5,7 @@ export const packedHashtagSchema = {
type: "string",
optional: false,
nullable: false,
example: "firefish",
example: "iceshrimp",
},
mentionedUsersCount: {
type: "number",

View file

@ -16,10 +16,10 @@ export default async (job: Bull.Job<WebhookDeliverJobData>) => {
url: job.data.to,
method: "POST",
headers: {
"User-Agent": "Firefish-Hooks",
"X-Firefish-Host": config.host,
"X-Firefish-Hook-Id": job.data.webhookId,
"X-Firefish-Hook-Secret": job.data.secret,
"User-Agent": "Iceshrimp-Hooks",
"X-Iceshrimp-Host": config.host,
"X-Iceshrimp-Hook-Id": job.data.webhookId,
"X-Iceshrimp-Hook-Secret": job.data.secret,
"Content-Type": "application/json",
},
body: JSON.stringify({

View file

@ -68,8 +68,8 @@ export async function createImage(
/**
* Resolve Image.
*
* If the target Image is registered in Firefish, return it, otherwise
* Fetch from remote server, register with Firefish and return it.
* If the target Image is registered in Iceshrimp, return it, otherwise
* Fetch from remote server, register with Iceshrimp and return it.
*/
export async function resolveImage(
actor: CacheableRemoteUser,

View file

@ -92,7 +92,7 @@ export function validateNote(object: any, uri: string) {
/**
* Fetch Notes.
*
* If the target Note is registered in Firefish, it will be returned.
* If the target Note is registered in Iceshrimp, it will be returned.
*/
export async function fetchNote(
object: string | IObject,
@ -397,8 +397,8 @@ export async function createNote(
/**
* Resolve Note.
*
* If the target Note is registered in Firefish, return it, otherwise
* Fetch from remote server, register with Firefish and return it.
* If the target Note is registered in Iceshrimp, return it, otherwise
* Fetch from remote server, register with Iceshrimp and return it.
*/
export async function resolveNote(
value: string | IObject,

View file

@ -127,7 +127,7 @@ function validateActor(x: IObject, uri: string): IActor {
/**
* Fetch a Person.
*
* If the target Person is registered in Firefish, it will be returned.
* If the target Person is registered in Iceshrimp, it will be returned.
*/
export async function fetchPerson(
uri: string,
@ -378,7 +378,7 @@ export async function createPerson(
/**
* Update Person data from remote.
* If the target Person is not registered in Firefish, it is ignored.
* If the target Person is not registered in Iceshrimp, it is ignored.
* @param uri URI of Person
* @param resolver Resolver
* @param hint Hint of Person object (If this value is a valid Person, it is used for updating without Remote resolve)
@ -564,8 +564,8 @@ export async function updatePerson(
/**
* Resolve Person.
*
* If the target person is registered in Firefish, it returns it;
* otherwise, it fetches it from the remote server, registers it in Firefish, and returns it.
* If the target person is registered in Iceshrimp, it returns it;
* otherwise, it fetches it from the remote server, registers it in Iceshrimp, and returns it.
*/
export async function resolvePerson(
uri: string,

View file

@ -337,7 +337,7 @@ import * as ep___users_stats from "./endpoints/users/stats.js";
import * as ep___fetchRss from "./endpoints/fetch-rss.js";
import * as ep___admin_driveCapOverride from "./endpoints/admin/drive-capacity-override.js";
//Firefish Move
//Iceshrimp Move
import * as ep___i_move from "./endpoints/i/move.js";
import * as ep___i_known_as from "./endpoints/i/known-as.js";

View file

@ -16,7 +16,7 @@ export const paramDef = {
export default define(meta, paramDef, async () => {
let tag_name;
await fetch(
"https://codeberg.org/api/v1/repos/firefish/firefish/releases?draft=false&pre-release=false&page=1&limit=1",
"https://iceshrimp.dev/api/v1/repos/iceshrimp/iceshrimp/releases?draft=false&pre-release=false&page=1&limit=1",
)
.then((response) => response.json())
.then((data) => {

View file

@ -42,7 +42,7 @@ export const meta = {
optional: false,
nullable: false,
format: "url",
example: "https://firefish.example.com",
example: "https://iceshrimp.example.com",
},
description: {
type: "string",
@ -68,13 +68,13 @@ export const meta = {
type: "string",
optional: false,
nullable: false,
default: "https://codeberg.org/firefish/firefish",
default: "https://iceshrimp.dev/iceshrimp/iceshrimp",
},
feedbackUrl: {
type: "string",
optional: false,
nullable: false,
default: "https://codeberg.org/firefish/firefish/issues",
default: "https://iceshrimp.dev/iceshrimp/iceshrimp/issues",
},
defaultDarkTheme: {
type: "string",

View file

@ -18,7 +18,7 @@ export default define(meta, paramDef, async () => {
let release;
await fetch(
"https://codeberg.org/firefish/firefish/raw/branch/develop/release.json",
"https://iceshrimp.dev/iceshrimp/iceshrimp/raw/branch/dev/release.json",
)
.then((response) => response.json())
.then((data) => {

View file

@ -103,7 +103,7 @@ export function apiMastodonCompatible(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.dismissInstanceAnnouncement(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data;
} catch (e: any) {

View file

@ -114,7 +114,7 @@ export function apiAccountMastodon(router: Router): void {
let reqIds = [];
for (let i = 0; i < ids.length; i++) {
reqIds.push(convertId(ids[i], IdType.FirefishId));
reqIds.push(convertId(ids[i], IdType.IceshrimpId));
}
const data = await client.getRelationships(reqIds);
@ -135,7 +135,7 @@ export function apiAccountMastodon(router: Router): void {
const accessTokens = ctx.headers.authorization;
const client = getClient(BASE_URL, accessTokens);
try {
const calcId = convertId(ctx.params.id, IdType.FirefishId);
const calcId = convertId(ctx.params.id, IdType.IceshrimpId);
const data = await client.getAccount(calcId);
ctx.body = convertAccount(data.data);
} catch (e: any) {
@ -153,7 +153,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountStatuses(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
convertTimelinesArgsId(argsToBools(limitToInt(ctx.query as any))),
);
ctx.body = data.data.map((status) => convertStatus(status));
@ -173,7 +173,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountFeaturedTags(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data.map((tag) => convertFeaturedTag(tag));
} catch (e: any) {
@ -192,7 +192,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountFollowers(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
convertTimelinesArgsId(limitToInt(ctx.query as any)),
);
ctx.body = data.data.map((account) => convertAccount(account));
@ -212,7 +212,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountFollowing(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
convertTimelinesArgsId(limitToInt(ctx.query as any)),
);
ctx.body = data.data.map((account) => convertAccount(account));
@ -232,7 +232,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountLists(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data.map((list) => convertList(list));
} catch (e: any) {
@ -251,7 +251,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.followAccount(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
let acct = convertRelationship(data.data);
acct.following = true;
@ -272,7 +272,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unfollowAccount(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
let acct = convertRelationship(data.data);
acct.following = false;
@ -293,7 +293,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.blockAccount(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertRelationship(data.data);
} catch (e: any) {
@ -331,7 +331,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.muteAccount(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
(ctx.request as any).body as any,
);
ctx.body = convertRelationship(data.data);
@ -351,7 +351,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unmuteAccount(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertRelationship(data.data);
} catch (e: any) {
@ -478,7 +478,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.acceptFollowRequest(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertRelationship(data.data);
} catch (e: any) {
@ -497,7 +497,7 @@ export function apiAccountMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.rejectFollowRequest(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertRelationship(data.data);
} catch (e: any) {

View file

@ -27,7 +27,7 @@ export function apiFilterMastodon(router: Router): void {
const body: any = ctx.request.body;
try {
const data = await client.getFilter(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertFilter(data.data);
} catch (e: any) {
@ -59,7 +59,7 @@ export function apiFilterMastodon(router: Router): void {
const body: any = ctx.request.body;
try {
const data = await client.updateFilter(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
body.phrase,
body.context,
);
@ -78,7 +78,7 @@ export function apiFilterMastodon(router: Router): void {
const body: any = ctx.request.body;
try {
const data = await client.deleteFilter(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data;
} catch (e: any) {

View file

@ -45,7 +45,7 @@ export function apiNotificationsMastodon(router: Router): void {
const body: any = ctx.request.body;
try {
const dataRaw = await client.getNotification(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
const data = convertNotification(dataRaw.data);
ctx.body = data;
@ -85,7 +85,7 @@ export function apiNotificationsMastodon(router: Router): void {
const body: any = ctx.request.body;
try {
const data = await client.dismissNotification(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data;
} catch (e: any) {

View file

@ -26,9 +26,9 @@ export function apiStatusMastodon(router: Router): void {
try {
let body: any = ctx.request.body;
if (body.in_reply_to_id)
body.in_reply_to_id = convertId(body.in_reply_to_id, IdType.FirefishId);
body.in_reply_to_id = convertId(body.in_reply_to_id, IdType.IceshrimpId);
if (body.quote_id)
body.quote_id = convertId(body.quote_id, IdType.FirefishId);
body.quote_id = convertId(body.quote_id, IdType.IceshrimpId);
if (
(!body.poll && body["poll[options][]"]) ||
(!body.media_ids && body["media_ids[]"])
@ -63,7 +63,7 @@ export function apiStatusMastodon(router: Router): void {
if (body.media_ids && !body.media_ids.length) body.media_ids = undefined;
if (body.media_ids) {
body.media_ids = (body.media_ids as string[]).map((p) =>
convertId(p, IdType.FirefishId),
convertId(p, IdType.IceshrimpId),
);
}
const { sensitive } = body;
@ -102,7 +102,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -117,7 +117,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.deleteStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data;
} catch (e: any) {
@ -139,7 +139,7 @@ export function apiStatusMastodon(router: Router): void {
const accessTokens = ctx.headers.authorization;
const client = getClient(BASE_URL, accessTokens);
try {
const id = convertId(ctx.params.id, IdType.FirefishId);
const id = convertId(ctx.params.id, IdType.IceshrimpId);
const data = await client.getStatusContext(
id,
convertTimelinesArgsId(limitToInt(ctx.query as any)),
@ -167,7 +167,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getStatusHistory(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data.map((account) => convertAccount(account));
} catch (e: any) {
@ -185,7 +185,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getStatusRebloggedBy(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data.map((account) => convertAccount(account));
} catch (e: any) {
@ -203,7 +203,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getStatusFavouritedBy(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data.map((account) => convertAccount(account));
} catch (e: any) {
@ -222,7 +222,7 @@ export function apiStatusMastodon(router: Router): void {
const react = await getFirstReaction(BASE_URL, accessTokens);
try {
const a = (await client.createEmojiReaction(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
react,
)) as any;
//const data = await client.favouriteStatus(ctx.params.id) as any;
@ -244,7 +244,7 @@ export function apiStatusMastodon(router: Router): void {
const react = await getFirstReaction(BASE_URL, accessTokens);
try {
const data = await client.deleteEmojiReaction(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
react,
);
ctx.body = convertStatus(data.data);
@ -264,7 +264,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.reblogStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -283,7 +283,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unreblogStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -302,7 +302,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.bookmarkStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -321,7 +321,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unbookmarkStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -340,7 +340,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.pinStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -359,7 +359,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unpinStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertStatus(data.data);
} catch (e: any) {
@ -378,7 +378,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.reactStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
ctx.params.name,
);
ctx.body = convertStatus(data.data);
@ -398,7 +398,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.unreactStatus(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
ctx.params.name,
);
ctx.body = convertStatus(data.data);
@ -416,7 +416,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getMedia(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertAttachment(data.data);
} catch (e: any) {
@ -431,7 +431,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.updateMedia(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
ctx.request.body as any,
);
ctx.body = convertAttachment(data.data);
@ -447,7 +447,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getPoll(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertPoll(data.data);
} catch (e: any) {
@ -464,7 +464,7 @@ export function apiStatusMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.votePoll(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
(ctx.request.body as any).choices,
);
ctx.body = convertPoll(data.data);

View file

@ -46,11 +46,11 @@ export function argsToBools(q: ParsedUrlQuery) {
export function convertTimelinesArgsId(q: ParsedUrlQuery) {
if (typeof q.min_id === "string")
q.min_id = convertId(q.min_id, IdType.FirefishId);
q.min_id = convertId(q.min_id, IdType.IceshrimpId);
if (typeof q.max_id === "string")
q.max_id = convertId(q.max_id, IdType.FirefishId);
q.max_id = convertId(q.max_id, IdType.IceshrimpId);
if (typeof q.since_id === "string")
q.since_id = convertId(q.since_id, IdType.FirefishId);
q.since_id = convertId(q.since_id, IdType.IceshrimpId);
return q;
}
@ -121,7 +121,7 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getListTimeline(
convertId(ctx.params.listId, IdType.FirefishId),
convertId(ctx.params.listId, IdType.IceshrimpId),
convertTimelinesArgsId(limitToInt(ctx.query)),
);
ctx.body = data.data.map((status) => convertStatus(status));
@ -173,7 +173,7 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = convertList(data.data);
} catch (e: any) {
@ -206,7 +206,7 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.updateList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
(ctx.request.body as any).title,
);
ctx.body = convertList(data.data);
@ -226,7 +226,7 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.deleteList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
);
ctx.body = data.data;
} catch (e: any) {
@ -245,7 +245,7 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.getAccountsInList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
convertTimelinesArgsId(ctx.query as any),
);
ctx.body = data.data.map((account) => convertAccount(account));
@ -265,9 +265,9 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.addAccountsToList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
(ctx.query.account_ids as string[]).map((id) =>
convertId(id, IdType.FirefishId),
convertId(id, IdType.IceshrimpId),
),
);
ctx.body = data.data;
@ -287,9 +287,9 @@ export function apiTimelineMastodon(router: Router): void {
const client = getClient(BASE_URL, accessTokens);
try {
const data = await client.deleteAccountsFromList(
convertId(ctx.params.id, IdType.FirefishId),
convertId(ctx.params.id, IdType.IceshrimpId),
(ctx.query.account_ids as string[]).map((id) =>
convertId(id, IdType.FirefishId),
convertId(id, IdType.IceshrimpId),
),
);
ctx.body = data.data;

View file

@ -9,13 +9,13 @@ export function genOpenapiSpec() {
info: {
version: "v1",
title: "Firefish API",
title: "Iceshrimp API",
"x-logo": { url: "/static-assets/api-doc.png" },
},
externalDocs: {
description: "Repository",
url: "https://codeberg.org/firefish/firefish",
url: "https://iceshrimp.dev/iceshrimp/iceshrimp",
},
servers: [
@ -106,7 +106,7 @@ export function genOpenapiSpec() {
description: desc,
externalDocs: {
description: "Source code",
url: `https://codeberg.org/firefish/firefish/src/branch/develop/packages/backend/src/server/api/endpoints/${endpoint.name}.ts`,
url: `https://iceshrimp.dev/iceshrimp/iceshrimp/src/branch/dev/packages/backend/src/server/api/endpoints/${endpoint.name}.ts`,
},
tags: endpoint.meta.tags || undefined,
security,

View file

@ -45,7 +45,7 @@ main {
* {
font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif;
}
#firefish_app {
#iceshrimp_app {
display: none !important;
}
body,

View file

@ -185,7 +185,7 @@
font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif;
}
#firefish_app,
#iceshrimp_app,
#splash {
display: none !important;
}

View file

@ -26,7 +26,7 @@ img {
text-align: center;
}
#firefish_app {
#iceshrimp_app {
display: none !important;
}

View file

@ -43,7 +43,7 @@ export default async function (
id: author.link,
title: `${author.name} (@${user.username}@${config.host})`,
updated: notes[0].createdAt,
generator: "Firefish",
generator: "Iceshrimp",
description: `${user.notesCount} Notes, ${
profile.ffVisibility === "public" ? user.followingCount : "?"
} Following, ${

View file

@ -1,6 +1,6 @@
{
"short_name": "Firefish",
"name": "Firefish",
"short_name": "Iceshrimp",
"name": "Iceshrimp",
"description": "An open source, decentralized social media platform that's free forever!",
"start_url": "/",
"display": "standalone",

View file

@ -9,8 +9,8 @@ export const manifestHandler = async (ctx: Koa.Context) => {
const instance = await fetchMeta(true);
res.short_name = instance.name || "Firefish";
res.name = instance.name || "Firefish";
res.short_name = instance.name || "Iceshrimp";
res.name = instance.name || "Iceshrimp";
if (instance.themeColor) res.theme_color = instance.themeColor;
ctx.set("Cache-Control", "max-age=300");

View file

@ -29,7 +29,7 @@ export default class Logger {
if (config.syslog) {
this.syslogClient = new SyslogPro.RFC5424({
applacationName: "Firefish",
applacationName: "Iceshrimp",
timestamp: true,
encludeStructuredData: true,
color: true,

View file

@ -55,33 +55,33 @@ describe("fromHtml", () => {
it("link with different text", () => {
assert.deepStrictEqual(
fromHtml('<p>a <a href="https://joinfirefish.org/b">c</a> d</p>'),
"a [c](https://joinfirefish.org/b) d",
fromHtml('<p>a <a href="https://iceshrimp.dev/b">c</a> d</p>'),
"a [c](https://iceshrimp.dev/b) d",
);
});
it("link with different text, but not encoded", () => {
assert.deepStrictEqual(
fromHtml('<p>a <a href="https://joinfirefish.org/ä">c</a> d</p>'),
"a [c](<https://joinfirefish.org/ä>) d",
fromHtml('<p>a <a href="https://iceshrimp.dev/ä">c</a> d</p>'),
"a [c](<https://iceshrimp.dev/ä>) d",
);
});
it("link with same text", () => {
assert.deepStrictEqual(
fromHtml(
'<p>a <a href="https://joinfirefish.org/b">https://joinfirefish.org/b</a> d</p>',
'<p>a <a href="https://joiniceshrimp.org/b">https://joiniceshrimp.org/b</a> d</p>',
),
"a https://joinfirefish.org/b d",
"a https://joiniceshrimp.org/b d",
);
});
it("link with same text, but not encoded", () => {
assert.deepStrictEqual(
fromHtml(
'<p>a <a href="https://joinfirefish.org/ä">https://joinfirefish.org/ä</a> d</p>',
'<p>a <a href="https://joiniceshrimp.org/ä">https://joiniceshrimp.org/ä</a> d</p>',
),
"a <https://joinfirefish.org/ä> d",
"a <https://joiniceshrimp.org/ä> d",
);
});
@ -98,8 +98,8 @@ describe("fromHtml", () => {
it("link without text", () => {
assert.deepStrictEqual(
fromHtml('<p>a <a href="https://joinfirefish.org/b"></a> d</p>'),
"a https://joinfirefish.org/b d",
fromHtml('<p>a <a href="https://joiniceshrimp.org/b"></a> d</p>'),
"a https://joiniceshrimp.org/b d",
);
});
@ -110,15 +110,15 @@ describe("fromHtml", () => {
it("mention", () => {
assert.deepStrictEqual(
fromHtml(
'<p>a <a href="https://joinfirefish.org/@user" class="u-url mention">@user</a> d</p>',
'<p>a <a href="https://joiniceshrimp.org/@user" class="u-url mention">@user</a> d</p>',
),
"a @user@joinfirefish.org d",
"a @user@joiniceshrimp.org d",
);
});
it("hashtag", () => {
assert.deepStrictEqual(
fromHtml('<p>a <a href="https://joinfirefish.org/tags/a">#a</a> d</p>', [
fromHtml('<p>a <a href="https://joiniceshrimp.org/tags/a">#a</a> d</p>', [
"#a",
]),
"a #a d",

View file

@ -24,13 +24,13 @@
</template>
<script lang="ts" setup>
import * as firefish from "iceshrimp-js";
import * as iceshrimp from "iceshrimp-js";
import MkMiniChart from "@/components/MkMiniChart.vue";
import * as os from "@/os";
import { getProxiedImageUrlNullable } from "@/scripts/media-proxy";
const props = defineProps<{
instance: firefish.entities.Instance;
instance: iceshrimp.entities.Instance;
}>();
let chartValues = $ref<number[] | null>(null);

View file

@ -35,7 +35,7 @@ const instance = props.instance ?? {
'meta[name="theme-color-orig"]',
) as HTMLMetaElement
)?.content,
softwareName: Instance.softwareName || "Firefish",
softwareName: Instance.softwareName || "Iceshrimp",
};
const capitalize = (s: string) => s && s[0].toUpperCase() + s.slice(1);

View file

@ -8,7 +8,7 @@
<span>Switch is now {{ flag ? "on" : "off" }}</span>
</MkSwitch>
<div style="margin: 32px 0">
<MkRadio v-model="radio" value="misskey">Firefish</MkRadio>
<MkRadio v-model="radio" value="misskey">Iceshrimp</MkRadio>
<MkRadio v-model="radio" value="mastodon">Mastodon</MkRadio>
<MkRadio v-model="radio" value="pleroma">Pleroma</MkRadio>
</div>
@ -50,12 +50,12 @@ export default defineComponent({
return {
text: "",
flag: true,
radio: "firefish",
radio: "iceshrimp",
mfm: `Hello world! This is an @example mention. BTW, you are @${
this.$i ? this.$i.username : "guest"
}.\nAlso, here is ${config.url} and [example link](${
config.url
}). for more details, see https://joinfirefish.org.\nAs you know #misskey is open-source software.`,
}). for more details, see https://iceshrimp.dev.\nAs you know #misskey is open-source software.`,
};
},
@ -82,7 +82,7 @@ export default defineComponent({
},
baz: {
type: "string",
default: "Firefish makes you happy.",
default: "iceshrimp makes you happy.",
label: "This is a string property",
},
});

View file

@ -1,7 +1,7 @@
<template>
<div v-if="instance.disableRegistration" style="margin-bottom: 1rem">
<p>{{ i18n.ts.signupsDisabled }}</p>
<a href="https://joinfirefish.org/join">
<a href="https://iceshrimp.dev/join">
<MkButton rounded gradate
>{{ i18n.ts.findOtherInstance }}
</MkButton>

View file

@ -14,6 +14,6 @@ export const lang = localStorage.getItem("lang");
export const langs = _LANGS_;
export const locale = JSON.parse(localStorage.getItem("locale"));
export const version = _VERSION_;
export const instanceName = siteName === "Firefish" ? host : siteName;
export const instanceName = siteName === "Iceshrimp" ? host : siteName;
export const ui = localStorage.getItem("ui");
export const debug = localStorage.getItem("debug") === "true";

View file

@ -216,7 +216,7 @@ function checkForSplash() {
// https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210
// なぜかinit.tsの内容が2回実行されることがあるため、mountするdivを1つに制限する
const rootEl = (() => {
const MISSKEY_MOUNT_DIV_ID = "firefish_app";
const MISSKEY_MOUNT_DIV_ID = "iceshrimp_app";
const currentEl = document.getElementById(MISSKEY_MOUNT_DIV_ID);

View file

@ -41,7 +41,7 @@
<MkInfo v-if="updateAvailable" warn class="info"
>{{ i18n.ts.updateAvailable }}
<a
href="https://codeberg.org/firefish/firefish/releases"
href="https://iceshrimp.dev/iceshrimp/iceshrimp/releases"
target="_bank"
class="_link"
>{{ i18n.ts.check }}</a

View file

@ -340,7 +340,7 @@
import { watch } from "vue";
import { Virtual } from "swiper/modules";
import { Swiper, SwiperSlide } from "swiper/vue";
import type * as firefish from "iceshrimp-js";
import type * as iceshrimp from "iceshrimp-js";
import MkChart from "@/components/MkChart.vue";
import MkObjectView from "@/components/MkObjectView.vue";
import FormLink from "@/components/form/link.vue";
@ -363,11 +363,11 @@ import "swiper/scss";
import "swiper/scss/virtual";
import { getProxiedImageUrlNullable } from "@/scripts/media-proxy";
type AugmentedInstanceMetadata = firefish.entities.DetailedInstanceMetadata & {
type AugmentedInstanceMetadata = iceshrimp.entities.DetailedInstanceMetadata & {
blockedHosts: string[];
silencedHosts: string[];
};
type AugmentedInstance = firefish.entities.Instance & {
type AugmentedInstance = iceshrimp.entities.Instance & {
isBlocked: boolean;
isSilenced: boolean;
};

View file

@ -455,7 +455,7 @@ defineProps<{
let preview_mention = $ref("@example");
let preview_hashtag = $ref("#test");
let preview_link = $ref(`[${i18n.ts._mfm.dummy}](https://joinfirefish.org)`);
let preview_link = $ref(`[${i18n.ts._mfm.dummy}](https://iceshrimp.dev)`);
let preview_emoji = $ref(
instance.emojis.length ? `:${instance.emojis[0].name}:` : ":emojiname:",
);

View file

@ -215,7 +215,7 @@ definePageMetadata(
}
.fcuexfpr {
#firefish_app > :not(.wallpaper) & {
#iceshrimp_app > :not(.wallpaper) & {
background: var(--bg);
}

View file

@ -22,7 +22,7 @@
><i class="ph-upload-simple ph-bold ph-lg"></i
></template>
<FormRadios v-model="importType" class="_formBlock">
<option value="firefish">Firefish/Misskey</option>
<option value="iceshrimp">iceshrimp/Misskey</option>
<option value="mastodon">Mastodon/Akkoma/Pleroma</option>
<option :disabled="true" value="twitter">
Twitter (soon)
@ -188,7 +188,7 @@ import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
const excludeMutingUsers = ref(false);
const importType = ref("firefish");
const importType = ref("iceshrimp");
const excludeInactiveUsers = ref(false);
const onExportSuccess = () => {

View file

@ -1,6 +1,6 @@
<template>
<form class="mk-setup" @submit.prevent="submit()">
<h1>Welcome to Firefish!</h1>
<h1>Welcome to Iceshrimp!</h1>
<div class="_formRoot">
<p>{{ i18n.ts.intro }}</p>
<MkInput

View file

@ -302,7 +302,7 @@ export const routes = [
},
{
path: "/about-iceshrimp",
component: page(() => import("./pages/about-firefish.vue")),
component: page(() => import("./pages/about-iceshrimp.vue")),
},
{
path: "/theme-editor",

View file

@ -37,7 +37,7 @@ export function openHelpMenu_(ev: MouseEvent) {
text: i18n.ts.apps,
icon: "ph-device-mobile ph-bold ph-lg",
action: () => {
window.open("https://joinfirefish.org/apps", "_blank");
window.open("https://iceshrimp.dev/apps", "_blank");
},
},
{

View file

@ -6,7 +6,7 @@
id: 'dark',
name: 'Dark',
author: 'Firefish Contributors',
author: 'Iceshrimp Contributors',
desc: 'Default dark theme',
kind: 'dark',

View file

@ -6,7 +6,7 @@
id: 'light',
name: 'Light',
author: 'Firefish Contributors',
author: 'Iceshrimp Contributors',
desc: 'Default light theme',
kind: 'light',

View file

@ -254,10 +254,10 @@ function more(ev: MouseEvent) {
box-sizing: border-box;
overflow: auto;
overflow-x: clip;
#firefish_app > :not(.wallpaper) & {
#iceshrimp_app > :not(.wallpaper) & {
background: var(--navBg);
}
#firefish_app > .wallpaper:not(.centered) & {
#iceshrimp_app > .wallpaper:not(.centered) & {
border-right: 1px solid var(--divider);
}
contain: strict;

View file

@ -1,6 +1,6 @@
# Firefish.js
# iceshrimp.js
Fork of Misskey.js for Firefish
Fork of Misskey.js for Iceshrimp
https://www.npmjs.com/package/iceshrimp-js

View file

@ -1,7 +1,7 @@
{
"name": "iceshrimp-js",
"version": "0.0.24",
"description": "Firefish SDK for JavaScript",
"description": "iceshrimp SDK for JavaScript",
"main": "./built/index.js",
"types": "./built/index.d.ts",
"scripts": {
@ -18,7 +18,7 @@
},
"repository": {
"type": "git",
"url": "https://codeberg.org/firefish/firefish.git"
"url": "https://iceshrimp.dev/iceshrimp/iceshrimp.git"
},
"devDependencies": {
"@microsoft/api-documenter": "^7.22.21",

View file

@ -4,7 +4,7 @@ import * as Misskey from "../src";
describe("API", () => {
test("success", async () => {
const cli = new Misskey.api.APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
const res = await cli.request("meta", { detail: true });
@ -13,7 +13,7 @@ describe("API", () => {
test("conditional respose type (meta)", async () => {
const cli = new Misskey.api.APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -35,7 +35,7 @@ describe("API", () => {
test("conditional respose type (users/show)", async () => {
const cli = new Misskey.api.APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});

View file

@ -3,7 +3,7 @@ import * as Misskey from "../src";
describe("Streaming", () => {
test("emit type", async () => {
const stream = new Misskey.Stream("https://firefish.test", {
const stream = new Misskey.Stream("https://iceshrimp.test", {
token: "TOKEN",
});
const mainChannel = stream.useChannel("main");
@ -13,7 +13,7 @@ describe("Streaming", () => {
});
test("params type", async () => {
const stream = new Misskey.Stream("https://firefish.test", {
const stream = new Misskey.Stream("https://iceshrimp.test", {
token: "TOKEN",
});
// TODO: 「stream.useChannel の第二引数として受け入れる型が

View file

@ -20,7 +20,7 @@ describe("API", () => {
fetchMock.resetMocks();
fetchMock.mockResponse(async (req) => {
const body = await req.json();
if (req.method === "POST" && req.url === "https://firefish.test/api/i") {
if (req.method === "POST" && req.url === "https://iceshrimp.test/api/i") {
if (body.i === "TOKEN") {
return JSON.stringify({ id: "foo" });
} else {
@ -32,7 +32,7 @@ describe("API", () => {
});
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -43,7 +43,7 @@ describe("API", () => {
});
expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({
url: "https://firefish.test/api/i",
url: "https://iceshrimp.test/api/i",
method: "POST",
body: { i: "TOKEN" },
});
@ -55,7 +55,7 @@ describe("API", () => {
const body = await req.json();
if (
req.method === "POST" &&
req.url === "https://firefish.test/api/notes/show"
req.url === "https://iceshrimp.test/api/notes/show"
) {
if (body.i === "TOKEN" && body.noteId === "aaaaa") {
return JSON.stringify({ id: "foo" });
@ -68,7 +68,7 @@ describe("API", () => {
});
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -79,7 +79,7 @@ describe("API", () => {
});
expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({
url: "https://firefish.test/api/notes/show",
url: "https://iceshrimp.test/api/notes/show",
method: "POST",
body: { i: "TOKEN", noteId: "aaaaa" },
});
@ -90,7 +90,7 @@ describe("API", () => {
fetchMock.mockResponse(async (req) => {
if (
req.method === "POST" &&
req.url === "https://firefish.test/api/reset-password"
req.url === "https://iceshrimp.test/api/reset-password"
) {
return { status: 204 };
} else {
@ -99,7 +99,7 @@ describe("API", () => {
});
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -111,7 +111,7 @@ describe("API", () => {
expect(res).toEqual(null);
expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({
url: "https://firefish.test/api/reset-password",
url: "https://iceshrimp.test/api/reset-password",
method: "POST",
body: { i: "TOKEN", token: "aaa", password: "aaa" },
});
@ -121,7 +121,7 @@ describe("API", () => {
fetchMock.resetMocks();
fetchMock.mockResponse(async (req) => {
const body = await req.json();
if (req.method === "POST" && req.url === "https://firefish.test/api/i") {
if (req.method === "POST" && req.url === "https://iceshrimp.test/api/i") {
if (typeof body.i === "string") {
return JSON.stringify({ id: "foo" });
} else {
@ -143,7 +143,7 @@ describe("API", () => {
try {
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -172,7 +172,7 @@ describe("API", () => {
try {
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -189,7 +189,7 @@ describe("API", () => {
try {
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});
@ -210,7 +210,7 @@ describe("API", () => {
try {
const cli = new APIClient({
origin: "https://firefish.test",
origin: "https://iceshrimp.test",
credential: "TOKEN",
});

View file

@ -3,8 +3,8 @@ import Stream from "../src/streaming";
describe("Streaming", () => {
test("useChannel", async () => {
const server = new WS("wss://firefish.test/streaming");
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
const server = new WS("wss://iceshrimp.test/streaming");
const stream = new Stream("https://iceshrimp.test", { token: "TOKEN" });
const mainChannelReceived: any[] = [];
const main = stream.useChannel("main");
main.on("meUpdated", (payload) => {
@ -44,8 +44,8 @@ describe("Streaming", () => {
});
test("useChannel with parameters", async () => {
const server = new WS("wss://firefish.test/streaming");
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
const server = new WS("wss://iceshrimp.test/streaming");
const stream = new Stream("https://iceshrimp.test", { token: "TOKEN" });
const messagingChannelReceived: any[] = [];
const messaging = stream.useChannel("messaging", { otherparty: "aaa" });
messaging.on("message", (payload) => {
@ -86,8 +86,8 @@ describe("Streaming", () => {
});
test("ちゃんとチャンネルごとにidが異なる", async () => {
const server = new WS("wss://firefish.test/streaming");
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
const server = new WS("wss://iceshrimp.test/streaming");
const stream = new Stream("https://iceshrimp.test", { token: "TOKEN" });
stream.useChannel("messaging", { otherparty: "aaa" });
stream.useChannel("messaging", { otherparty: "bbb" });
@ -111,8 +111,8 @@ describe("Streaming", () => {
});
test("Connection#send", async () => {
const server = new WS("wss://firefish.test/streaming");
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
const server = new WS("wss://iceshrimp.test/streaming");
const stream = new Stream("https://iceshrimp.test", { token: "TOKEN" });
const messaging = stream.useChannel("messaging", { otherparty: "aaa" });
messaging.send("read", { id: "aaa" });
@ -136,8 +136,8 @@ describe("Streaming", () => {
});
test("Connection#dispose", async () => {
const server = new WS("wss://firefish.test/streaming");
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
const server = new WS("wss://iceshrimp.test/streaming");
const stream = new Stream("https://iceshrimp.test", { token: "TOKEN" });
const mainChannelReceived: any[] = [];
const main = stream.useChannel("main");
main.on("meUpdated", (payload) => {

View file

@ -44,7 +44,7 @@ module.exports = {
),
_ENV_: JSON.stringify(process.env.NODE_ENV),
_DEV_: !isProduction,
_PERF_PREFIX_: JSON.stringify("Firefish:"),
_PERF_PREFIX_: JSON.stringify("IceShrimp:"),
}),
],
};

View file

@ -1,5 +1,5 @@
{
"version": "1.0.0",
"notes": "Welcome to Firefish!",
"notes": "Welcome to Iceshrimp!",
"screenshots": []
}