from ..common import wd_logger
from ..common.exceptions import LoginRequiredException
from ..connector.ajax import AjaxModuleConnectorClient, AjaxModuleConnectorConfig
from .auth import HTTPAuthentication
from .private_message import (
PrivateMessage,
PrivateMessageCollection,
PrivateMessageInbox,
PrivateMessageSentBox,
)
from .site import Site
from .user import AbstractUser, User, UserCollection
[ドキュメント]
class ClientUserMethods:
"""
ユーザー関連の操作を提供するクラス
クライアントインスタンスに関連付けられ、Wikidotユーザーの取得や操作を行うメソッドを提供する。
Client.userプロパティを通じてアクセスする。
"""
def __init__(self, client: "Client"):
"""
初期化メソッド
Parameters
----------
client : Client
親クライアントインスタンス
"""
self.client = client
[ドキュメント]
def get(self, name: str, raise_when_not_found: bool = False) -> "AbstractUser":
"""
ユーザー名からユーザーオブジェクトを取得する
Parameters
----------
name : str
ユーザー名
raise_when_not_found : bool, default False
ユーザーが見つからない場合に例外を送出するかどうか (True: 送出する, False: 送出しない)
デフォルトでは送出せずにNoneを返す
Returns
-------
AbstractUser
ユーザーオブジェクト
"""
return User.from_name(self.client, name, raise_when_not_found)
[ドキュメント]
def get_bulk(self, names: list[str], raise_when_not_found: bool = False) -> UserCollection:
"""
複数のユーザー名からユーザーオブジェクトのコレクションを取得する
Parameters
----------
names : list[str]
ユーザー名のリスト
raise_when_not_found : bool, default False
ユーザーが見つからない場合に例外を送出するかどうか (True: 送出する, False: 送出しない)
デフォルトでは送出せずにNoneを返す
Returns
-------
UserCollection
ユーザーオブジェクトのコレクション
"""
return UserCollection.from_names(self.client, names, raise_when_not_found)
[ドキュメント]
class ClientPrivateMessageMethods:
"""
プライベートメッセージ関連の操作を提供するクラス
クライアントインスタンスに関連付けられ、Wikidotプライベートメッセージの送信や取得を行うメソッドを提供する。
Client.private_messageプロパティを通じてアクセスする。
"""
def __init__(self, client: "Client"):
"""
初期化メソッド
Parameters
----------
client : Client
親クライアントインスタンス
"""
self.client = client
[ドキュメント]
def send(self, recipient: User, subject: str, body: str) -> None:
"""
プライベートメッセージを送信する
Parameters
----------
recipient : User
受信者
subject : str
件名
body : str
本文
"""
PrivateMessage.send(self.client, recipient, subject, body)
@property
def inbox(self) -> PrivateMessageInbox:
"""
受信箱を取得する
Returns
-------
PrivateMessageInbox
受信箱オブジェクト
"""
return PrivateMessageInbox.acquire(self.client)
@property
def sentbox(self) -> PrivateMessageSentBox:
"""
送信箱を取得する
Returns
-------
PrivateMessageSentBox
送信箱オブジェクト
"""
return PrivateMessageSentBox.acquire(self.client)
[ドキュメント]
def get_messages(self, message_ids: list[int]) -> PrivateMessageCollection:
"""
複数のメッセージIDからメッセージのコレクションを取得する
Parameters
----------
message_ids : list[int]
メッセージIDのリスト
Returns
-------
PrivateMessageCollection
メッセージのコレクション
"""
return PrivateMessageCollection.from_ids(self.client, message_ids)
[ドキュメント]
def get_message(self, message_id: int) -> PrivateMessage:
"""
メッセージIDからメッセージを取得する
Parameters
----------
message_id : int
メッセージID
Returns
-------
PrivateMessage
メッセージオブジェクト
"""
return PrivateMessage.from_id(self.client, message_id)
[ドキュメント]
class ClientSiteMethods:
"""
サイト関連の操作を提供するクラス
クライアントインスタンスに関連付けられ、Wikidotサイトの取得や操作を行うメソッドを提供する。
Client.siteプロパティを通じてアクセスする。
"""
def __init__(self, client: "Client"):
"""
初期化メソッド
Parameters
----------
client : Client
親クライアントインスタンス
"""
self.client = client
[ドキュメント]
def get(self, unix_name: str) -> "Site":
"""
UNIX名からサイトオブジェクトを取得する
Parameters
----------
unix_name : str
サイトのUNIX名(例: 'fondation')
Returns
-------
Site
サイトオブジェクト
"""
return Site.from_unix_name(self.client, unix_name)
[ドキュメント]
class Client:
"""
Wikidot APIへの接続とインタラクションを管理する基幹クライアント
このクラスは、Wikidot APIとの全てのインタラクションの基盤となる。
ユーザー認証、サイト操作、ページ管理などすべての機能はこのクライアントを通じて提供される。
"""
def __init__(
self,
username: str | None = None,
password: str | None = None,
amc_config: AjaxModuleConnectorConfig | None = None,
logging_level: str = "WARNING",
):
"""
クライアントの初期化とオプションでの認証を行う
Parameters
----------
username : str | None, default None
ユーザー名。設定すると認証試行を行う
password : str | None, default None
パスワード。設定すると認証試行を行う
amc_config : AjaxModuleConnectorConfig | None, default None
AjaxModuleConnectorの設定
logging_level : str, default "WARNING"
ロギングレベル
"""
# 最初にロギングレベルを決定する
wd_logger.setLevel(logging_level)
# AMCClientを初期化
self.amc_client = AjaxModuleConnectorClient(site_name=None, config=amc_config)
# セッション関連変数の初期化
self.is_logged_in = False
self.username = None
# usernameとpasswordが指定されていればログインする
if username is not None and password is not None:
HTTPAuthentication.login(self, username, password)
self.is_logged_in = True
self.username = username
self.me = User.from_name(self, username)
# ----------
# 以下メソッド
# ----------
self.user = ClientUserMethods(self)
self.private_message = ClientPrivateMessageMethods(self)
self.site = ClientSiteMethods(self)
# ------------
# メソッド終わり
# ------------
def __del__(self):
"""
デストラクタ - クライアントの使用終了時の後処理
ログイン中であればログアウト処理を行い、リソースを解放する。
"""
if self.is_logged_in:
HTTPAuthentication.logout(self)
self.is_logged_in = False
self.username = None
del self
def __enter__(self):
"""
コンテキストマネージャプロトコルのエントリーポイント
with文でクライアントを使用する際に呼び出される。
Returns
-------
Client
自身のインスタンス
"""
return self
def __exit__(self, exc_type, exc_value, traceback):
"""
コンテキストマネージャプロトコルの終了処理
with文の終了時に呼び出され、自動的にログアウト処理を行う。
Parameters
----------
exc_type : type
発生した例外の型
exc_value : Exception
発生した例外
traceback : traceback
例外のトレースバック
"""
self.__del__()
return
def __str__(self):
"""
オブジェクトの文字列表現
Returns
-------
str
クライアントの文字列表現
"""
return f"Client(username={self.username}, is_logged_in={self.is_logged_in})"
[ドキュメント]
def login_check(self) -> None:
"""
ログイン状態の確認
ログインが必要な操作を実行する前に呼び出される。
ログインしていない場合は例外を送出する。
Raises
------
LoginRequiredException
ログインしていない場合
"""
if not self.is_logged_in:
raise LoginRequiredException("Login is required to execute this function")
return