Skip to content

Instantly share code, notes, and snippets.

@Cheaterman
Last active November 11, 2022 16:19
Show Gist options
  • Save Cheaterman/516afbf3724ff62cb768bd8c1610e410 to your computer and use it in GitHub Desktop.
Save Cheaterman/516afbf3724ff62cb768bd8c1610e410 to your computer and use it in GitHub Desktop.
Basic PySAMP+SQLAlchemy example
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