1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00

Add initial polls support

This commit is contained in:
Steffo 2020-03-23 22:38:37 +01:00
parent 091203357c
commit fa039f35c3
11 changed files with 263 additions and 1 deletions

View file

@ -39,7 +39,7 @@ class BrawlhallaCommand(Command):
string = f" [b]{bh.name}[/b]\n\n" string = f" [b]{bh.name}[/b]\n\n"
if bh.rank_1v1: if bh.rank_1v1:
string += f"1v1: [b]{bh.rank_1v1}[/b]\n" string += f"1v1: [b]{bh.rank_1v1}[/b] ({bh.rating_1v1} MMR)\n"
return string return string

View file

@ -10,6 +10,9 @@ from .api_wiki_get import ApiWikiGetStar
from .api_wiki_list import ApiWikiListStar from .api_wiki_list import ApiWikiListStar
from .api_fiorygi_get import ApiFiorygiGetStar from .api_fiorygi_get import ApiFiorygiGetStar
from .api_diario_random import ApiDiarioRandomStar from .api_diario_random import ApiDiarioRandomStar
from .api_polls_create import ApiPollsCreate
from .api_polls_get import ApiPollsGet
from .api_polls_list import ApiPollsList
# Enter the PageStars of your Pack here! # Enter the PageStars of your Pack here!
available_page_stars = [ available_page_stars = [
@ -24,6 +27,9 @@ available_page_stars = [
ApiWikiListStar, ApiWikiListStar,
ApiFiorygiGetStar, ApiFiorygiGetStar,
ApiDiarioRandomStar, ApiDiarioRandomStar,
ApiPollsCreate,
ApiPollsGet,
ApiPollsList,
] ]
# Don't change this, it should automatically generate __all__ # Don't change this, it should automatically generate __all__

View file

@ -0,0 +1,41 @@
from typing import *
import datetime
import uuid
from royalnet.utils import *
from royalnet.constellation.api import *
from ..tables import Poll
class ApiPollsCreate(ApiStar):
path = "/api/polls/create/v1"
summary = "Create a new poll."
parameters = {
"question": "The question to ask in the poll.",
"description": "A longer Markdown-formatted description.",
"expires": "A ISO timestamp of the expiration date for the poll.",
}
requires_auth = True
methods = ["POST"]
tags = ["polls"]
async def api(self, data: ApiData) -> JSON:
PollT = self.alchemy.get(Poll)
poll = PollT(
id=uuid.uuid4(),
creator=await data.user(),
created=datetime.datetime.now(),
expires=datetime.datetime.fromisoformat(data["expires"]) if "expires" in data else None,
question=data["question"],
description=data.get("description"),
)
data.session.add(poll)
await data.session_commit()
return poll.json()

View file

@ -0,0 +1,34 @@
from typing import *
import datetime
from royalnet.utils import *
from royalnet.constellation.api import *
from ..tables import Poll
import uuid
class ApiPollsGet(ApiStar):
path = "/api/polls/get/v1"
summary = "Get the poll with a specific id."
parameters = {
"uuid": "The UUID of the poll to get.",
}
requires_auth = True
tags = ["polls"]
async def api(self, data: ApiData) -> JSON:
PollT = self.alchemy.get(Poll)
try:
pid = uuid.UUID(data["uuid"])
except (ValueError, AttributeError, TypeError):
raise InvalidParameterError("'uuid' is not a valid UUID.")
poll: Poll = await asyncify(data.session.query(PollT).get, pid)
if poll is None:
raise NotFoundError("No such page.")
return poll.json()

View file

@ -0,0 +1,28 @@
from typing import *
from royalnet.utils import *
from royalnet.constellation.api import *
from ..tables import Poll
import uuid
class ApiPollsList(ApiStar):
path = "/api/polls/list/v1"
summary = "Get a list of all polls."
requires_auth = True
tags = ["polls"]
async def api(self, data: ApiData) -> JSON:
PollT = self.alchemy.get(Poll)
polls: List[Poll] = await asyncify(data.session.query(PollT).all)
return list(map(lambda p: {
"id": p.id,
"question": p.question,
"creator": p.creator.json(),
"expires": p.expires.isoformat(),
"created": p.created.isoformat(),
}, polls))

View file

@ -10,6 +10,9 @@ from .steam import Steam
from .dota import Dota from .dota import Dota
from .fiorygitransactions import FiorygiTransaction from .fiorygitransactions import FiorygiTransaction
from .brawlhalla import Brawlhalla from .brawlhalla import Brawlhalla
from .polls import Poll
from .pollcomments import PollComment
from .pollvotes import PollVote
# Enter the tables of your Pack here! # Enter the tables of your Pack here!
available_tables = [ available_tables = [
@ -24,6 +27,9 @@ available_tables = [
Dota, Dota,
FiorygiTransaction, FiorygiTransaction,
Brawlhalla, Brawlhalla,
Poll,
PollComment,
PollVote,
] ]
# Don't change this, it should automatically generate __all__ # Don't change this, it should automatically generate __all__

View file

@ -0,0 +1,41 @@
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.dialects.postgresql import UUID
from ..types import PollMood
class PollComment:
__tablename__ = "pollcomments"
@declared_attr
def id(self):
return Column(Integer, primary_key=True)
@declared_attr
def author_id(self):
return Column(Integer, ForeignKey("users.uid"), nullable=False)
@declared_attr
def author(self):
return relationship("User", backref=backref("poll_comments_created"))
@declared_attr
def poll_id(self):
return Column(UUID(as_uuid=True), ForeignKey("polls.id"))
@declared_attr
def poll(self):
return relationship("Poll", backref=backref("comments"))
@declared_attr
def posted(self):
return Column(DateTime, nullable=False)
@declared_attr
def mood(self):
return Column(Enum(PollMood), nullable=False, default=PollMood.NEUTRAL)
@declared_attr
def comment(self):
return Column(Text)

64
royalpack/tables/polls.py Normal file
View file

@ -0,0 +1,64 @@
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.dialects.postgresql import UUID
class Poll:
__tablename__ = "polls"
@declared_attr
def id(self):
return Column(UUID(as_uuid=True), primary_key=True)
@declared_attr
def question(self):
return Column(String, nullable=False)
@declared_attr
def description(self):
return Column(Text, nullable=False, server_default="")
@declared_attr
def creator_id(self):
return Column(Integer, ForeignKey("users.uid"))
@declared_attr
def creator(self):
return relationship("User", backref=backref("polls_created"))
@declared_attr
def expires(self):
return Column(DateTime)
@declared_attr
def created(self):
return Column(DateTime, nullable=False)
def json(self):
return {
"id": self.id,
"question": self.question,
"description": self.description,
"creator": self.creator.json(),
"expires": self.expires.isoformat(),
"created": self.created.isoformat(),
"votes": map(
lambda v: {
"caster": v.caster.json(),
"posted": v.posted.isoformat(),
"vote": v.vote.name
},
sorted(self.votes, key=lambda v: v.posted)
),
"comments": map(
lambda c: {
"id": c.id,
"comment": c.comment,
"creator": c.creator.json(),
"posted": c.posted.isoformat(),
"mood": c.mood.name,
},
sorted(self.comments, key=lambda c: c.posted)
)
}

View file

@ -0,0 +1,33 @@
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declared_attr
from ..types import PollMood
from sqlalchemy.dialects.postgresql import UUID
class PollVote:
__tablename__ = "pollvotes"
@declared_attr
def caster_id(self):
return Column(Integer, ForeignKey("users.uid"), primary_key=True)
@declared_attr
def caster(self):
return relationship("User", backref=backref("poll_votes_cast"))
@declared_attr
def poll_id(self):
return Column(UUID(as_uuid=True), ForeignKey("polls.id"), primary_key=True)
@declared_attr
def poll(self):
return relationship("Poll", backref=backref("votes"))
@declared_attr
def posted(self):
return Column(DateTime, nullable=False)
@declared_attr
def vote(self):
return Column(Enum(PollMood), nullable=False, default=PollMood.NEUTRAL)

View file

@ -9,6 +9,7 @@ from .dotarank import DotaRank
from .brawlhallatier import BrawlhallaTier from .brawlhallatier import BrawlhallaTier
from .brawlhallametal import BrawlhallaMetal from .brawlhallametal import BrawlhallaMetal
from .brawlhallarank import BrawlhallaRank from .brawlhallarank import BrawlhallaRank
from .pollmood import PollMood
__all__ = [ __all__ = [
@ -24,4 +25,5 @@ __all__ = [
"BrawlhallaMetal", "BrawlhallaMetal",
"BrawlhallaRank", "BrawlhallaRank",
"BrawlhallaTier", "BrawlhallaTier",
"PollMood",
] ]

View file

@ -0,0 +1,7 @@
import enum
class PollMood(enum.Enum):
POSITIVE = 1
NEUTRAL = 0
NEGATIVE = -1