inital commit

This commit is contained in:
2021-07-24 16:28:35 +09:00
parent aa71a7a3cc
commit c6cf7cc88b
39 changed files with 949 additions and 66 deletions

View File

@@ -47,12 +47,20 @@ function App(): JSX.Element {
<li>
<Link to='/'>Home</Link>
</li>
<li>
<Link to='/players'>Players</Link>
</li>
{
/*
<li>
<Link to='/tournaments/stray_sheep_0/players'>Players</Link>
</li>
<li>
<Link to='/tournaments/stray_sheep_0/scoreboard'>Scoreboard</Link>
</li>
*/
}
<li>
<Link to='/guide'>Guide</Link>
</li>

View File

@@ -14,17 +14,15 @@ export const Home: FunctionComponent<ComponentProps> = (props): JSX.Element => {
return (
<div className={style.mainBody}>
<div className={style.chalice} />
<div className={style.titleImageStrayShip0} />
<div className={style.players} />
<div className={style.titleImageStrayShip4} />
<div className={style.padding} />
<div className={style.tonamel}>
<a href='https://tonamel.com/competition/49WpE' rel='noopener noreferrer' target='_blank'>&nbsp;</a>
</div>
<div className={style.padding} />
<div className={style.rule} />
<div className={style.twitchHome}>
<a href='https://www.twitch.tv/catherine_faito_crab' rel='noopener noreferrer' target='_blank'>&nbsp;</a>
</div>
<YouTube
videoId={'oetCaugzOew'}
opts={opts}
/>
</div>
);
};

View File

@@ -464,6 +464,14 @@
background-size: contain;
background-repeat: none;
}
.titleImageStrayShip4 {
width: 808px;
height: 119px;
margin: auto;
background-image: url('https://static.catherine-fc.com/media/straysheepcup4.png');
background-size: contain;
background-repeat: none;
}
.rule {
width: 900px;
height: 637px;
@@ -472,7 +480,19 @@
background-size: contain;
background-repeat: none;
}
.tonamel {
width: 900px;
height: 637px;
margin: auto;
background-image: url('https://static.catherine-fc.com/media/tonamel.png');
background-size: contain;
background-repeat: none;
&> a {
display:block;
width: 900px;
height: 637px;
}
}
.padding {
width: 900px;
height: 100px;

View File

@@ -7,6 +7,7 @@ import dotenv from 'dotenv';
import { v1 } from 'uuid';
import { IJankenSelect, IJankenResult } from './models/message';
import { IRoom } from './models';
dotenv.config();
const port: number = 8080;
@@ -157,13 +158,9 @@ httpServer.listen(port, () => {
// Janken Tool
let room: boolean = false;
let playerOne: string = '';
let playerTwo: string = '';
let playerOneOption: string = '';
let playerTwoOption: string = '';
let stages: string[] = [];
let currentIndex: number = 0;
let rooms: Record<string, IRoom> = {};
const defaultStages: string[] = ['cementery', 'prison', 'torture', 'inquisition', 'quadrangle', 'clock', 'spiral', 'empireo', 'cathedral', 'close', 'arrange'];
io.on('connection', (socket: socketIo.Socket) => {
@@ -174,45 +171,74 @@ io.on('connection', (socket: socketIo.Socket) => {
socket.on('exitGame', () => {
console.log('exitGame');
io.emit('exitGame');
room = false;
initRoom();
rooms = {};
Object.keys(io.sockets.sockets).forEach((s: string) => {
io.sockets.sockets[s].disconnect(true);
});
});
socket.on('janken', (data: IJankenSelect) => {
console.log('janken', data);
if (playerOne === data.userName) {
playerOneOption = data.option;
} else if (playerTwo === data.userName) {
playerTwoOption = data.option;
}
console.log('playerOneOption', playerOneOption);
console.log('playerTwoOption', playerTwoOption);
if (playerOneOption !== '' && playerTwoOption !== '') {
const message: IJankenResult = {
playerOne,
playerOneOption,
playerTwo,
playerTwoOption
};
io.emit('jankenResult', message);
const currentRoom = rooms[data.room];
if (currentRoom) {
if (currentRoom.playerOne === data.userName) {
currentRoom.playerOneOption = data.option;
} else if (currentRoom.playerTwo === data.userName) {
currentRoom.playerTwoOption = data.option;
}
console.log('playerOneOption', currentRoom.playerOneOption);
console.log('playerTwoOption', currentRoom.playerTwoOption);
if (currentRoom.playerOneOption !== '' && currentRoom.playerTwoOption !== '') {
const message: IJankenResult = {
playerOne: currentRoom.playerOne,
playerOneOption: currentRoom.playerOneOption,
playerTwo: currentRoom.playerTwo,
playerTwoOption: currentRoom.playerTwoOption
};
io.to(data.room).emit('jankenResult', message);
const sqlToPrepare = 'INSERT INTO `janken` (`match`, `result`) VALUES(?, ?);';
const sql = mysql.format(sqlToPrepare, [data.room, JSON.stringify(message)]);
connection.query(sql,
(error: mysql.MysqlError | null, results: any) => {
if (error) {
console.error(error);
}
}
);
if (currentRoom.playerOneOption !== currentRoom.playerTwoOption) {
delete rooms[data.room];
}
}
}
});
socket.on('registerUser', (data: string) => {
socket.on('registerUser', (data: {username: string, room: string}) => {
console.log('registerUser', data);
if (playerOne === '') {
playerOne = data;
socket.emit('registerUser', data);
} else if (playerTwo === '') {
playerTwo = data;
socket.emit('registerUser', data);
let currentRoom: IRoom = {
playerOne: '',
playerTwo: '',
playerOneOption: '',
playerTwoOption: ''
};
if (rooms[data.room]) {
currentRoom = rooms[data.room];
} else {
rooms = {
...rooms,
[data.room]: currentRoom
};
}
socket.join(data.room);
if (currentRoom.playerOne === '') {
currentRoom.playerOne = data.username;
socket.emit('registerUser', data.username);
} else if (currentRoom.playerTwo === '') {
currentRoom.playerTwo = data.username;
socket.emit('registerUser', data.username);
}
const message = {
playerOne,
playerTwo
playerOne: currentRoom.playerOne,
playerTwo: currentRoom.playerTwo
};
io.emit('login', message);
io.to(data.room).emit('login', message);
});
socket.on('moveToStage', () => {
console.log('moveToStage');
@@ -227,11 +253,14 @@ io.on('connection', (socket: socketIo.Socket) => {
io.emit('updateIndex', currentIndex);
}
});
socket.on('againGame', () => {
console.log('againGame');
io.emit('againGame');
playerOneOption = '';
playerTwoOption = '';
socket.on('againGame', (room: string) => {
const currentRoom = rooms[room];
if (currentRoom) {
console.log('againGame');
io.to(room).emit('againGame');
currentRoom.playerOneOption = '';
currentRoom.playerTwoOption = '';
}
});
socket.on('previousIndex', () => {
console.log('previousIndex');
@@ -240,6 +269,7 @@ io.on('connection', (socket: socketIo.Socket) => {
io.emit('updateIndex', currentIndex);
}
});
/*
if (!room) {
// create new room
initRoom();
@@ -264,15 +294,14 @@ io.on('connection', (socket: socketIo.Socket) => {
socket.emit('stages', message);
}
}
*/
const initialmessage = {
playerOne: '',
playerTwo: '',
};
socket.emit('login', initialmessage);
});
const shuffle = (array: string[]): string[] => {
return array.sort(() => Math.random() - 0.5);
};
const initRoom = (): void => {
playerOne = '';
playerTwo = '';
playerOneOption = '';
playerTwoOption = '';
};

View File

@@ -0,0 +1,6 @@
export interface IRoom {
playerOne: string;
playerTwo: string;
playerOneOption: string;
playerTwoOption: string;
}

View File

@@ -16,5 +16,6 @@ export interface ILogin {
export interface IJankenSelect {
userName: string;
room: string;
option: string;
}

1
main-web/serverless/go/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
pkg/

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,21 @@
# Serverless directories
.serverless
# golang output binary directory
bin
# golang vendor (dependencies) directory
vendor
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, build with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out

View File

@@ -0,0 +1,91 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
digest = "1:1f2ee62e40b3b0ca8403e49a07afb9ae8c0980391be1986e9f6c4ac9de1b1a90"
name = "github.com/aws/aws-lambda-go"
packages = [
"events",
"lambda",
"lambda/handlertrace",
"lambda/messages",
"lambdacontext",
]
pruneopts = ""
revision = "55dc88be4cdfaaf4bb4d9f65debd8d4310e0a83c"
version = "v1.19.1"
[[projects]]
digest = "1:913aa8374d300095f235fe6762f74a9ca82bf1fb30d4f830540b2a5dd6f993e4"
name = "github.com/aws/aws-sdk-go"
packages = [
"aws",
"aws/awserr",
"aws/awsutil",
"aws/client",
"aws/client/metadata",
"aws/corehandlers",
"aws/credentials",
"aws/credentials/ec2rolecreds",
"aws/credentials/endpointcreds",
"aws/credentials/processcreds",
"aws/credentials/stscreds",
"aws/csm",
"aws/defaults",
"aws/ec2metadata",
"aws/endpoints",
"aws/request",
"aws/session",
"aws/signer/v4",
"internal/context",
"internal/ini",
"internal/sdkio",
"internal/sdkmath",
"internal/sdkrand",
"internal/sdkuri",
"internal/shareddefaults",
"internal/strings",
"internal/sync/singleflight",
"private/protocol",
"private/protocol/json/jsonutil",
"private/protocol/jsonrpc",
"private/protocol/query",
"private/protocol/query/queryutil",
"private/protocol/rest",
"private/protocol/xml/xmlutil",
"service/ssm",
"service/sts",
"service/sts/stsiface",
]
pruneopts = ""
revision = "2bec4e3ae9cb717c0082a489e75ab9db71c98b23"
version = "v1.34.22"
[[projects]]
digest = "1:a67f9275b42e8bb95ba38f705062175ef65538bcdc107e0771763e6cde80c3c3"
name = "github.com/go-sql-driver/mysql"
packages = ["."]
pruneopts = ""
revision = "17ef3dd9d98b69acec3e85878995ada9533a9370"
version = "v1.5.0"
[[projects]]
digest = "1:13fe471d0ed891e8544eddfeeb0471fd3c9f2015609a1c000aefdedf52a19d40"
name = "github.com/jmespath/go-jmespath"
packages = ["."]
pruneopts = ""
revision = "c2b33e84"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
input-imports = [
"github.com/aws/aws-lambda-go/events",
"github.com/aws/aws-lambda-go/lambda",
"github.com/aws/aws-sdk-go/aws",
"github.com/aws/aws-sdk-go/aws/session",
"github.com/aws/aws-sdk-go/service/ssm",
"github.com/go-sql-driver/mysql",
]
solver-name = "gps-cdcl"
solver-version = 1

View File

@@ -0,0 +1,25 @@
# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
[[constraint]]
name = "github.com/aws/aws-lambda-go"
version = "1.x"

View File

@@ -0,0 +1,12 @@
.PHONY: build clean deploy
build:
dep ensure -v
env GOOS=linux go build -ldflags="-s -w" -o bin/archive archive/main.go
env GOOS=linux go build -ldflags="-s -w" -o bin/guide guide/main.go
clean:
rm -rf ./bin ./vendor Gopkg.lock
deploy: clean build
sls deploy --verbose

View File

@@ -0,0 +1,72 @@
package main
import (
"bytes"
"context"
"encoding/json"
_ "github.com/go-sql-driver/mysql"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ssm"
)
// Response is of type APIGatewayProxyResponse since we're leveraging the
// AWS Lambda Proxy Request functionality (default behavior)
//
// https://serverless.com/framework/docs/providers/aws/events/apigateway/#lambda-proxy-integration
type Response events.APIGatewayProxyResponse
// Handler is our lambda handler invoked by the `lambda.Start` function call
func Handler(ctx context.Context) (Response, error) {
svc := ssm.New(session.New(), &aws.Config{
Region: aws.String("ap-northeast-1"),
})
res, _ := svc.GetParameter(&ssm.GetParameterInput{
Name: aws.String("db-endpoint"),
WithDecryption: aws.Bool(true),
})
dbendpoint := *res.Parameter.Value
/*
res, _ = svc.GetParameter(&ssm.GetParameterInput{
Name: aws.String("db-username"),
WithDecryption: aws.Bool(true),
})
dbusername := *res.Parameter.Value
res, _ = svc.GetParameter(&ssm.GetParameterInput{
Name: aws.String("db-password"),
WithDecryption: aws.Bool(true),
})
dbpassword := *res.Parameter.Value
*/
var buf bytes.Buffer
body, err := json.Marshal(map[string]interface{}{
"message": "Okay so your other function also executed successfully!",
"dbendpoint": dbendpoint,
})
if err != nil {
return Response{StatusCode: 404}, err
}
json.HTMLEscape(&buf, body)
resp := Response{
StatusCode: 200,
IsBase64Encoded: false,
Body: buf.String(),
Headers: map[string]string{
"Content-Type": "application/json",
"X-MyCompany-Func-Reply": "world-handler",
},
}
return resp, nil
}
func main() {
lambda.Start(Handler)
}

View File

@@ -0,0 +1,45 @@
package main
import (
"bytes"
"context"
"encoding/json"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
// Response is of type APIGatewayProxyResponse since we're leveraging the
// AWS Lambda Proxy Request functionality (default behavior)
//
// https://serverless.com/framework/docs/providers/aws/events/apigateway/#lambda-proxy-integration
type Response events.APIGatewayProxyResponse
// Handler is our lambda handler invoked by the `lambda.Start` function call
func Handler(ctx context.Context) (Response, error) {
var buf bytes.Buffer
body, err := json.Marshal(map[string]interface{}{
"message": "Go Serverless v1.0! Your function executed successfully!",
})
if err != nil {
return Response{StatusCode: 404}, err
}
json.HTMLEscape(&buf, body)
resp := Response{
StatusCode: 200,
IsBase64Encoded: false,
Body: buf.String(),
Headers: map[string]string{
"Content-Type": "application/json",
"X-MyCompany-Func-Reply": "hello-handler",
},
}
return resp, nil
}
func main() {
lambda.Start(Handler)
}

View File

@@ -0,0 +1,152 @@
# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
# docs.serverless.com
#
# Happy Coding!
service: catherine-fc-api
# app and org for use with dashboard.serverless.com
#app: your-app-name
#org: your-org-name
custom:
VpcId:
dev: "vpc-c54553a2"
sqa: "vpc-c54553a2"
int: "vpc-c54553a2"
uat: "vpc-c54553a2"
prd: "vpc-c54553a2"
Subnet1:
dev: "subnet-0d0fdf45"
sqa: "subnet-0d0fdf45"
int: "subnet-0d0fdf45"
uat: "subnet-0d0fdf45"
prd: "subnet-0d0fdf45"
Subnet2:
dev: "subnet-4dcecc16"
sqa: "subnet-4dcecc16"
int: "subnet-4dcecc16"
uat: "subnet-4dcecc16"
prd: "subnet-4dcecc16"
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"
frameworkVersion: '>=1.28.0 <=2.0.0'
provider:
name: aws
runtime: go1.x
region: ap-northeast-1
versionFunctions: false
logRetentionInDays: 14
memorySize: 128
deploymentBucket: catherine-fc-serverless-bucket
stage: dev
# you can overwrite defaults here
# stage: dev
# region: us-east-1
iamRoleStatements:
- Effect: "Allow"
Action:
- "lambda:InvokeFunction"
Resource:
- "arn:aws:lambda:*:*:function:*"
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
Resource:
- "arn:aws:logs:*:*:*"
- Effect: "Allow"
Action:
- "ssm:GetParameter"
Resource:
- "arn:aws:ssm:*:*:parameter/*"
# you can define service wide environment variables here
# environment:
# variable1: value1
package:
exclude:
- ./**
include:
- ./bin/**
functions:
guideAPI:
handler: bin/guide
timeout: 3
events:
- http:
path: guide
method: get
archiveAPI:
handler: bin/archive
timeout: 3
events:
- http:
path: archive
method: get
# The following are a few example events you can configure
# NOTE: Please make sure to change your handler code to work with those events
# Check the event documentation for details
# events:
# events:
# - http:
# path: users/create
# method: get
# - websocket: $connect
# - s3: ${env:BUCKET}
# - schedule: rate(10 minutes)
# - sns: greeter-topic
# - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
# - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
# - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
# - iot:
# sql: "SELECT * FROM 'some_topic'"
# - cloudwatchEvent:
# event:
# source:
# - "aws.ec2"
# detail-type:
# - "EC2 Instance State-change Notification"
# detail:
# state:
# - pending
# - cloudwatchLog: '/aws/lambda/hello'
# - cognitoUserPool:
# pool: MyUserPool
# trigger: PreSignUp
# - alb:
# listenerArn: arn:aws:elasticloadbalancing:us-east-1:XXXXXX:listener/app/my-load-balancer/50dc6c495c0c9188/
# priority: 1
# conditions:
# host: example.com
# path: /hello
# Define function environment variables here
# environment:
# variable2: value2
# you can add CloudFormation resource templates here
#resources:
# Resources:
# NewResource:
# Type: AWS::S3::Bucket
# Properties:
# BucketName: my-new-bucket
# Outputs:
# NewOutput:
# Description: "Description for the output"
# Value: "Some output value"