diff --git a/nft_ideas/nft_idea.go b/nft_ideas/nft_idea.go new file mode 100644 index 0000000..30a2a39 --- /dev/null +++ b/nft_ideas/nft_idea.go @@ -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}) +}