Skip to content

Commit

Permalink
Merge pull request #31 from PretendoNetwork/dev
Browse files Browse the repository at this point in the history
Merge dev to master
  • Loading branch information
jonbarrow authored Feb 17, 2025
2 parents 1654f0b + af5c5f1 commit b44feb2
Show file tree
Hide file tree
Showing 113 changed files with 2,516 additions and 2,268 deletions.
3 changes: 1 addition & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@
build
log
go.work
*.test
go.work.sum
go.work.sum
56 changes: 56 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Build and Publish Docker Image

on:
push:
pull_request:
workflow_dispatch:

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}

jobs:
build-publish:
env:
SHOULD_PUSH_IMAGE: ${{ (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest

permissions:
contents: read
packages: write

steps:
- name: Set up QEMU for Docker
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log into the container registry
if: ${{ env.SHOULD_PUSH_IMAGE == 'true' }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=edge,enable=${{ github.ref == 'refs/heads/dev' }}
type=sha
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
platforms: linux/amd64,linux/arm64
push: ${{ env.SHOULD_PUSH_IMAGE }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
47 changes: 32 additions & 15 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,19 +1,36 @@
# --- builder ---
FROM golang:1.20.6-alpine3.17 as builder
LABEL stage=builder
RUN apk add git
WORKDIR /build
# syntax=docker/dockerfile:1

COPY go.* ./
RUN go mod download
ARG app_dir="/home/go/app"

COPY . ./
ARG BUILD_STRING=pretendo.friends.docker
RUN go build -ldflags "-X 'main.serverBuildString=${BUILD_STRING}'" -v -o server

# --- runner ---
FROM alpine:3.17 as runner
WORKDIR /build
# * Building the application
FROM golang:1.23.6-alpine AS build
ARG app_dir
ARG build_string=pretendo.friends.docker

COPY --from=builder /build/server /build/
CMD ["/build/server"]
WORKDIR ${app_dir}

RUN --mount=type=cache,target=/go/pkg/mod/ \
--mount=type=bind,source=go.sum,target=go.sum \
--mount=type=bind,source=go.mod,target=go.mod \
go mod download -x

COPY . .
RUN --mount=type=cache,target=/go/pkg/mod/ \
CGO_ENABLED=0 go build -v -o ${app_dir}/build/server -ldflags "-X 'main.serverBuildString=${build_string}'"


# * Running the final application
FROM alpine:3.20 AS final
ARG app_dir
WORKDIR ${app_dir}

RUN addgroup go && adduser -D -G go go

RUN mkdir -p ${app_dir}/log && chown go:go ${app_dir}/log

USER go

COPY --from=build ${app_dir}/build/server ${app_dir}/server

CMD [ "./server" ]
25 changes: 12 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,15 @@ All configuration options are handled via environment variables

`.env` files are supported

| Name | Description | Required |
|-----------------------------------------|------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|
| `PN_FRIENDS_CONFIG_DATABASE_URI` | Fully qualified URI to your Postgres server (Example `postgres://username:password@localhost/friends?sslmode=disable`) | Yes |
| `PN_FRIENDS_CONFIG_KERBEROS_PASSWORD` | Password used as part of the internal server data in Kerberos tickets | No (Default password `password` will be used) |
| `PN_FRIENDS_CONFIG_AES_KEY` | AES key used in tokens provided by the account server | Yes |
| `PN_FRIENDS_CONFIG_GRPC_API_KEY` | API key for your GRPC server | No (Assumed to be an open gRPC API) |
| `PN_FRIENDS_GRPC_SERVER_PORT` | Port for the GRPC server | Yes |
| `PN_FRIENDS_AUTHENTICATION_SERVER_PORT` | Port for the authentication server | Yes |
| `PN_FRIENDS_SECURE_SERVER_HOST` | Host name for the secure server (should point to the same address as the authentication server) | Yes |
| `PN_FRIENDS_SECURE_SERVER_PORT` | Port for the secure server | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_HOST` | Host name for your account server gRPC service | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_PORT` | Port for your account server gRPC service | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_API_KEY` | API key for your account server gRPC service | No (Assumed to be an open gRPC API) |
| Name | Description | Required |
|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------|-------------------------------------|
| `PN_FRIENDS_CONFIG_DATABASE_URI` | Fully qualified URI to your Postgres server (Example `postgres://username:password@localhost/friends?sslmode=disable`) | Yes |
| `PN_FRIENDS_CONFIG_AES_KEY` | AES key used in tokens provided by the account server | Yes |
| `PN_FRIENDS_CONFIG_GRPC_API_KEY` | API key for your GRPC server | No (Assumed to be an open gRPC API) |
| `PN_FRIENDS_GRPC_SERVER_PORT` | Port for the GRPC server | Yes |
| `PN_FRIENDS_AUTHENTICATION_SERVER_PORT` | Port for the authentication server | Yes |
| `PN_FRIENDS_SECURE_SERVER_HOST` | Host name for the secure server (should point to the same address as the authentication server) | Yes |
| `PN_FRIENDS_SECURE_SERVER_PORT` | Port for the secure server | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_HOST` | Host name for your account server gRPC service | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_PORT` | Port for your account server gRPC service | Yes |
| `PN_FRIENDS_ACCOUNT_GRPC_API_KEY` | API key for your account server gRPC service | No (Assumed to be an open gRPC API) |
40 changes: 23 additions & 17 deletions database/3ds/get_friend_miis.go
Original file line number Diff line number Diff line change
@@ -1,40 +1,46 @@
package database_3ds

import (
"time"

"github.com/PretendoNetwork/friends/database"
"github.com/PretendoNetwork/nex-go"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/friends-3ds/types"
"github.com/PretendoNetwork/nex-go/v2/types"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/v2/friends-3ds/types"
"github.com/lib/pq"
)

// GetFriendMiis returns the Mii of all friends
func GetFriendMiis(pids []uint32) ([]*friends_3ds_types.FriendMii, error) {
friendMiis := make([]*friends_3ds_types.FriendMii, 0)
func GetFriendMiis(pids []uint32) (types.List[friends_3ds_types.FriendMii], error) {
friendMiis := types.NewList[friends_3ds_types.FriendMii]()

rows, err := database.Postgres.Query(`
SELECT pid, mii_name, mii_data FROM "3ds".user_data WHERE pid=ANY($1::int[])`, pq.Array(pids))
rows, err := database.Manager.Query(`
SELECT pid, mii_name, mii_profanity, mii_character_set, mii_data, mii_changed FROM "3ds".user_data WHERE pid=ANY($1::int[])`, pq.Array(pids))
if err != nil {
return friendMiis, err
}

changedTime := nex.NewDateTime(0)
changedTime.FromTimestamp(time.Now())
defer rows.Close()

for rows.Next() {
var pid uint32
var miiName string
var miiProfanity bool
var miiCharacterSet uint8
var miiData []byte
var changedTime uint64

mii := friends_3ds_types.NewMii()
mii.Unknown2 = false
mii.Unknown3 = 0
err := rows.Scan(&pid, &miiName, &miiProfanity, &miiCharacterSet, &miiData, &changedTime)
if err != nil {
return friendMiis, err
}

rows.Scan(&pid, &mii.Name, &mii.MiiData)
mii := friends_3ds_types.NewMii()
mii.Name = types.NewString(miiName)
mii.ProfanityFlag = types.NewBool(miiProfanity)
mii.CharacterSet = types.NewUInt8(miiCharacterSet)
mii.MiiData = types.NewBuffer(miiData)

friendMii := friends_3ds_types.NewFriendMii()
friendMii.PID = pid
friendMii.PID = types.NewPID(uint64(pid))
friendMii.Mii = mii
friendMii.ModifiedAt = changedTime
friendMii.ModifiedAt = types.NewDateTime(changedTime)

friendMiis = append(friendMiis, friendMii)
}
Expand Down
57 changes: 44 additions & 13 deletions database/3ds/get_friend_persistent_infos.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,70 @@ package database_3ds

import (
"github.com/PretendoNetwork/friends/database"
"github.com/PretendoNetwork/nex-go"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/friends-3ds/types"
"github.com/PretendoNetwork/nex-go/v2/types"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/v2/friends-3ds/types"
"github.com/lib/pq"
)

// GetFriendPersistentInfos returns the persistent information of all friends
func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) ([]*friends_3ds_types.FriendPersistentInfo, error) {
persistentInfos := make([]*friends_3ds_types.FriendPersistentInfo, 0)
func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) (types.List[friends_3ds_types.FriendPersistentInfo], error) {
persistentInfos := types.NewList[friends_3ds_types.FriendPersistentInfo]()

rows, err := database.Postgres.Query(`
SELECT pid, region, area, language, favorite_title, favorite_title_version, comment, comment_changed, last_online, mii_changed FROM "3ds".user_data WHERE pid=ANY($1::int[])`, pq.Array(pids))
rows, err := database.Manager.Query(`
SELECT pid, region, area, language, country, favorite_title, favorite_title_version, comment, comment_changed, last_online, mii_changed FROM "3ds".user_data WHERE pid=ANY($1::int[])`, pq.Array(pids))
if err != nil {
return persistentInfos, err
}
defer rows.Close()

for rows.Next() {
persistentInfo := friends_3ds_types.NewFriendPersistentInfo()

gameKey := friends_3ds_types.NewGameKey()

var pid uint32
var region uint8
var area uint8
var language uint8
var country uint8
var titleID uint64
var titleVersion uint16
var message string
var lastOnlineTime uint64
var msgUpdateTime uint64
var miiModifiedAtTime uint64

rows.Scan(
&persistentInfo.PID, &persistentInfo.Region, &persistentInfo.Area, &persistentInfo.Language,
&gameKey.TitleID, &gameKey.TitleVersion, &persistentInfo.Message, &msgUpdateTime, &lastOnlineTime, &miiModifiedAtTime)
err := rows.Scan(
&pid,
&region,
&area,
&language,
&country,
&titleID,
&titleVersion,
&message,
&msgUpdateTime,
&lastOnlineTime,
&miiModifiedAtTime,
)
if err != nil {
return persistentInfos, err
}

persistentInfo.MessageUpdatedAt = nex.NewDateTime(msgUpdateTime)
persistentInfo.MiiModifiedAt = nex.NewDateTime(miiModifiedAtTime)
persistentInfo.LastOnline = nex.NewDateTime(lastOnlineTime)
gameKey.TitleID = types.NewUInt64(titleID)
gameKey.TitleVersion = types.NewUInt16(titleVersion)

persistentInfo.PID = types.NewPID(uint64(pid))
persistentInfo.Region = types.NewUInt8(region)
persistentInfo.Country = types.NewUInt8(country)
persistentInfo.Area = types.NewUInt8(area)
persistentInfo.Language = types.NewUInt8(language)
persistentInfo.Platform = types.NewUInt8(2) // * Always 3DS
persistentInfo.GameKey = gameKey
persistentInfo.Platform = 2 // Always 3DS
persistentInfo.Message = types.NewString(message)
persistentInfo.MessageUpdatedAt = types.NewDateTime(msgUpdateTime)
persistentInfo.MiiModifiedAt = types.NewDateTime(miiModifiedAtTime)
persistentInfo.LastOnline = types.NewDateTime(lastOnlineTime)

persistentInfos = append(persistentInfos, persistentInfo)
}
Expand Down
27 changes: 19 additions & 8 deletions database/3ds/get_user_friends.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,38 @@ import (
"database/sql"

"github.com/PretendoNetwork/friends/database"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/friends-3ds/types"
"github.com/PretendoNetwork/nex-go/v2/types"
friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/v2/friends-3ds/types"
)

// GetUserFriends returns all friend relationships of a user
func GetUserFriends(pid uint32) ([]*friends_3ds_types.FriendRelationship, error) {
friendRelationships := make([]*friends_3ds_types.FriendRelationship, 0)
func GetUserFriends(pid uint32) (types.List[friends_3ds_types.FriendRelationship], error) {
friendRelationships := types.NewList[friends_3ds_types.FriendRelationship]()

rows, err := database.Postgres.Query(`
SELECT user2_pid, type FROM "3ds".friendships WHERE user1_pid=$1 AND type=1 LIMIT 100`, pid)
rows, err := database.Manager.Query("SELECT user2_pid, type FROM \"3ds\".friendships WHERE user1_pid=$1 AND type=1 LIMIT 100", pid)
if err != nil {
if err == sql.ErrNoRows {
if err == sql.ErrNoRows {
return friendRelationships, database.ErrEmptyList
} else {
return friendRelationships, err
}
}
defer rows.Close()

for rows.Next() {
var pid uint32
var relationshipType uint8

err := rows.Scan(&pid, &relationshipType)
if err != nil {
return friendRelationships, err
}

relationship := friends_3ds_types.NewFriendRelationship()
relationship.LFC = 0
rows.Scan(&relationship.PID, &relationship.RelationshipType)

relationship.LFC = types.NewUInt64(0)
relationship.PID = types.NewPID(uint64(pid))
relationship.RelationshipType = types.NewUInt8(relationshipType)

friendRelationships = append(friendRelationships, relationship)
}
Expand Down
4 changes: 2 additions & 2 deletions database/3ds/remove_friendship.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (

// RemoveFriendship removes a user's friend relationship
func RemoveFriendship(user1_pid uint32, user2_pid uint32) error {
result, err := database.Postgres.Exec(`
result, err := database.Manager.Exec(`
DELETE FROM "3ds".friendships WHERE user1_pid=$1 AND user2_pid=$2`, user1_pid, user2_pid)
if err != nil {
return err
Expand All @@ -17,7 +17,7 @@ func RemoveFriendship(user1_pid uint32, user2_pid uint32) error {
return database.ErrFriendshipNotFound
}

_, err = database.Postgres.Exec(`
_, err = database.Manager.Exec(`
UPDATE "3ds".friendships SET type=0 WHERE user1_pid=$1 AND user2_pid=$2`, user2_pid, user1_pid)
if err != nil {
return err
Expand Down
Loading

0 comments on commit b44feb2

Please sign in to comment.