Upload files to "nft_ideas"
This commit is contained in:
parent
d46002e85e
commit
d6795fcf07
1 changed files with 156 additions and 0 deletions
156
nft_ideas/nft_idea.go
Normal file
156
nft_ideas/nft_idea.go
Normal file
|
@ -0,0 +1,156 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/native"
|
||||
"github.com/nspcc-dev/neo-go/pkg/interop/storage"
|
||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type Answer struct {
|
||||
wallet interop.Hash160
|
||||
content string
|
||||
votes []interop.Hash160
|
||||
answerIdx int
|
||||
nftID interop.Uint160 // NFT ID representing the answer
|
||||
}
|
||||
|
||||
var (
|
||||
// Переменная для хранения владельцев токенов (NFT)
|
||||
owners = make(map[uint64]util.Uint160)
|
||||
tokenID uint64
|
||||
)
|
||||
|
||||
func mintNFT(to util.Uint160, content string) uint64 {
|
||||
// Генерация уникального ID для NFT
|
||||
tokenID++
|
||||
// Создание NFT с уникальным tokenID
|
||||
owners[tokenID] = to
|
||||
fmt.Printf("Minted NFT with ID %d for content: %s\n", tokenID, content)
|
||||
return tokenID
|
||||
}
|
||||
|
||||
// Метод для передачи NFT
|
||||
func transferNFT(from util.Uint160, to util.Uint160, tokenID uint64) {
|
||||
// Проверка, что от sender есть токен, и он совпадает с передаваемым
|
||||
if owners[tokenID] != from {
|
||||
panic("You are not the owner of this token")
|
||||
}
|
||||
// Передаем токен
|
||||
owners[tokenID] = to
|
||||
fmt.Printf("Transferred NFT with ID %d from %s to %s\n", tokenID, from, to)
|
||||
}
|
||||
|
||||
// Функция для создания уникального NFT для каждого вопроса
|
||||
func mintQuestionNFT(roomId string, question string, sender interop.Hash160) uint64 {
|
||||
tokenID := mintNFT(sender, fmt.Sprintf("Question in Room %s: %s", roomId, question))
|
||||
// Можно добавить логику для хранения NFT информации в блокчейне
|
||||
return tokenID
|
||||
}
|
||||
|
||||
// Функция для создания уникального NFT для каждого ответа
|
||||
func mintAnswerNFT(roomId string, answer string, sender interop.Hash160) uint64 {
|
||||
tokenID := mintNFT(sender, fmt.Sprintf("Answer in Room %s: %s", roomId, answer))
|
||||
// Можно добавить логику для хранения NFT информации в блокчейне
|
||||
return tokenID
|
||||
}
|
||||
|
||||
func AskQuestion(roomId string, question string) bool {
|
||||
var ctx = storage.GetContext()
|
||||
var room = getRoom(ctx, roomId)
|
||||
|
||||
if !room.Host.Equals(getSender()) || room.Status != RoomStatusGameIsStarted {
|
||||
return false // Only host can ask question, room status must be game is started
|
||||
}
|
||||
|
||||
// Создание уникального NFT для этого вопроса
|
||||
nftID := mintQuestionNFT(roomId, question, getSender())
|
||||
|
||||
newRound := Round{
|
||||
number: len(room.Rounds) + 1,
|
||||
question: fmt.Sprintf("%s (NFT: %s)", question, nftID.String()),
|
||||
answers: []Answer{},
|
||||
}
|
||||
room.Rounds = append(room.Rounds, newRound)
|
||||
|
||||
// todo: Списание средств за создание вопроса ? Надо ли делать вообще или можно оставить бесплатным
|
||||
|
||||
setRoom(ctx, &room)
|
||||
return true
|
||||
}
|
||||
|
||||
func SendAnswer(roomId string, text string) bool {
|
||||
var ctx = storage.GetContext()
|
||||
var room = getRoom(ctx, roomId)
|
||||
|
||||
if !roomContainsPlayer(room.Players, getSender()) || room.Status != RoomStatusRoundIsStarted {
|
||||
return false // Only player can send content, room status must be round is started
|
||||
}
|
||||
|
||||
// Создание уникального NFT для этого ответа
|
||||
nftID := mintAnswerNFT(roomId, text, getSender())
|
||||
|
||||
// todo: Снятие денег за ввод ответа (если это необходимо)
|
||||
|
||||
var round = room.Rounds[len(room.Rounds)-1]
|
||||
answer := Answer{
|
||||
wallet: getSender(),
|
||||
content: text,
|
||||
votes: []interop.Hash160{},
|
||||
answerIdx: len(round.answers),
|
||||
nftID: nftID, // Link NFT to the answe
|
||||
}
|
||||
round.answers = append(round.answers, answer)
|
||||
|
||||
room.Rounds[len(room.Rounds)-1] = round
|
||||
setRoom(ctx, &room)
|
||||
return true
|
||||
}
|
||||
|
||||
// тут пока не уверена, надо подумать
|
||||
func GetWinner(roomId string) bool {
|
||||
var ctx = storage.GetContext()
|
||||
var room = getRoom(ctx, roomId)
|
||||
|
||||
if !room.Host.Equals(getSender()) || room.Status != RoomStatusVoting {
|
||||
return false // Only host can get winner, room status must be voting
|
||||
}
|
||||
|
||||
var round = room.Rounds[len(room.Rounds)-1]
|
||||
if len(round.answers) == 0 {
|
||||
return false // Zero winners, because no answer
|
||||
}
|
||||
|
||||
var winners = chooseWinner(round, room.CountWinners)
|
||||
var result string
|
||||
for i, winner := range winners {
|
||||
result += fmt.Sprintf("place:%d, winner:%s, answer NFT: %s,votes:%s\n", i, winner.wallet, winner.nftID.String(), winner.votes) // Show NFT ID for winners
|
||||
|
||||
// todo вот надо подумать, надо оно нам еще тут?
|
||||
// Mint NFT for the winner (we use the index as the token ID for simplicity)
|
||||
tokenID := uint64(i + 1) // Use a simple ID based on index (can be replaced with more complex logic)
|
||||
mint(winner.wallet, tokenID) // Mint NFT to the winner's wallet
|
||||
}
|
||||
|
||||
for _, player := range room.Players {
|
||||
sendMessageToPlayer(result, player)
|
||||
}
|
||||
|
||||
// Отправка награды победителям (например, сообщение о том, что они получили NFT)
|
||||
for _, winner := range winners {
|
||||
sendMessageToPlayer(fmt.Sprintf("Congratulations! You have received an NFT. Token ID: %d", uint64(winner.answerIdx+1)), Player{Wallet: winner.wallet})
|
||||
}
|
||||
|
||||
room.Status = RoomStatusGameIsStarted // Next game cycle available to AskQuestion
|
||||
setRoom(ctx, &room)
|
||||
return true
|
||||
}
|
||||
|
||||
// возможно понадобится
|
||||
|
||||
func TransferNFTToWinner(from util.Uint160, to util.Uint160, tokenID uint64) {
|
||||
transfer(from, to, tokenID)
|
||||
sendMessageToPlayer(fmt.Sprintf("You have received an NFT with Token ID: %d", tokenID), Player{Wallet: to})
|
||||
}
|
Loading…
Add table
Reference in a new issue