Last active
November 11, 2022 16:19
-
-
Save Cheaterman/516afbf3724ff62cb768bd8c1610e410 to your computer and use it in GitHub Desktop.
Basic PySAMP+SQLAlchemy example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from samp import ( | |
MAX_PLAYERS, | |
GetPlayerName, | |
GetPlayerScore, | |
IsPlayerConnected, | |
KillTimer, | |
SendClientMessage, | |
SetPlayerScore, | |
SetTimer, | |
) | |
from sqlalchemy import ( | |
Column, | |
Date, | |
Integer, | |
String, | |
create_engine, | |
func, | |
) | |
from sqlalchemy.orm import sessionmaker, scoped_session | |
from sqlalchemy.ext.declarative import declarative_base | |
engine = create_engine('sqlite://') | |
sessionmaker = scoped_session(sessionmaker(bind=engine)) | |
Base = declarative_base() | |
class User(Base): | |
__tablename__ = 'users' | |
id = Column(Integer, primary_key=True) | |
name = Column(String, nullable=False) | |
score = Column(Integer, nullable=False, server_default='0') | |
registration_date = Column(Date, nullable=False, default=func.now()) | |
score_timer = None | |
def give_score_to_all(score): | |
for playerid in range(MAX_PLAYERS): | |
if not IsPlayerConnected(playerid): | |
continue | |
SetPlayerScore(playerid, GetPlayerScore(playerid) + score) | |
def OnGameModeInit(): | |
global score_timer | |
score_timer = SetTimer(give_score_to_all, 1000, True, 1) | |
Base.metadata.create_all(engine) | |
def OnGameModeExit(): | |
KillTimer(score_timer) | |
def OnPlayerConnect(playerid): | |
player_name = GetPlayerName(playerid) | |
SendClientMessage( | |
playerid, | |
0xFF0000FF, | |
f'Hello from Python, {player_name}!', | |
) | |
with sessionmaker() as session: | |
user = session.query(User).filter_by(name=player_name).one_or_none() | |
if not user: | |
user = User( | |
name=player_name, | |
score=GetPlayerScore(playerid), | |
) | |
session.add(user) | |
session.commit() | |
SendClientMessage( | |
playerid, | |
0x80FF80, | |
f"We don't know you, {player_name}. " | |
f'We added you to our database.' | |
) | |
return | |
SetPlayerScore(playerid, user.score) | |
SendClientMessage( | |
playerid, | |
0x80FF80, | |
f'We remember you, {player_name}: ' | |
f'You registered on {user.registration_date}.' | |
f'Your score was set back to {user.score}.' | |
) | |
def OnPlayerDisconnect(playerid, reason): | |
with sessionmaker() as session: | |
user = session.query(User).filter_by( | |
name=GetPlayerName(playerid) | |
).one_or_none() | |
if not user: | |
return | |
user.score = GetPlayerScore(playerid) | |
session.commit() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment