from typing import Callable, Optional, Iterable, SupportsFloat
import datetime
import webcface.field
import webcface.value
import webcface.text
import webcface.view
import webcface.func
import webcface.func_listener
import webcface.log
import webcface.image
import webcface.message
import webcface.canvas2d
import webcface.canvas3d
[docs]
class Member(webcface.field.Field):
def __init__(self, base: "webcface.field.Field", member: str = "") -> None:
"""Memberを指すクラス
このコンストラクタを直接使わず、
Client.member(), Client.members(), Client.onMemberEntry などを使うこと
詳細は `Memberのドキュメント <https://na-trium-144.github.io/webcface/md_02__member.html>`_ を参照
"""
super().__init__(base._data, member if member != "" else base._member)
@property
def name(self) -> str:
"""Member名"""
return self._member
[docs]
def value(self, field: str) -> "webcface.value.Value":
"""Valueオブジェクトを生成"""
return webcface.value.Value(self, field)
[docs]
def text(self, field: str) -> "webcface.text.Text":
"""Textオブジェクトを生成"""
return webcface.text.Text(self, field)
[docs]
def variant(self, field: str) -> "webcface.text.Variant":
"""Variantオブジェクトを生成 (ver2.0〜)"""
return webcface.text.Variant(self, field)
[docs]
def image(self, field: str) -> "webcface.image.Image":
"""Imageオブジェクトを生成"""
return webcface.image.Image(self, field)
[docs]
def view(self, field: str) -> "webcface.view.View":
"""Viewオブジェクトを生成"""
return webcface.view.View(self, field)
[docs]
def canvas2d(
self,
field: str,
width: Optional[SupportsFloat] = None,
height: Optional[SupportsFloat] = None,
) -> "webcface.canvas2d.Canvas2D":
"""Canvas2Dオブジェクトを生成
:arg width, height: Canvas2Dのサイズを指定して初期化する
"""
return webcface.canvas2d.Canvas2D(self, field, width, height)
[docs]
def canvas3d(self, field: str) -> "webcface.canvas3d.Canvas3D":
"""Canvas3Dオブジェクトを生成"""
return webcface.canvas3d.Canvas3D(self, field)
[docs]
def log(self, field: str = "default") -> "webcface.log.Log":
"""Logオブジェクトを生成
:arg field: (ver2.1〜) Logの名前を指定可能(省略すると"default")
"""
return webcface.log.Log(self, field)
[docs]
def func(self, arg: str = "", **kwargs) -> "webcface.func.Func":
"""Funcオブジェクトを生成
#. member.func(arg: str)
* 指定した名前のFuncオブジェクトを生成・参照する。
#. @member.func(arg: str, [**kwargs])
* デコレータとして使い、デコレートした関数を指定した名前でセットする。
* デコレート後、関数は元のまま返す。
#. @member.func([**kwargs])
* 3と同じだが、名前はデコレートした関数から自動で取得される。
#. member.func(arg: Callable, [**kwargs])
* これはver2.0で削除。
2, 3 の場合のkwargsは Func.set() を参照。
"""
return webcface.func.Func(self, arg, **kwargs)
[docs]
def func_listener(self, field: str) -> "webcface.func_listener.FuncListener":
"""FuncListenerオブジェクトを生成
(ver2.2〜)
"""
return webcface.func_listener.FuncListener(self, field)
[docs]
def values(self) -> "Iterable[webcface.value.Value]":
"""このメンバーのValueをすべて取得する。
.. deprecated:: 1.1
"""
return self.value_entries()
[docs]
def value_entries(self) -> "Iterable[webcface.value.Value]":
"""このメンバーのValueをすべて取得する。"""
return map(self.value, self._data_check().value_store.get_entry(self._member))
[docs]
def texts(self) -> "Iterable[webcface.text.Text]":
"""このメンバーのTextをすべて取得する。
.. deprecated:: 1.1
"""
return self.text_entries()
[docs]
def text_entries(self) -> "Iterable[webcface.text.Text]":
"""このメンバーのTextをすべて取得する。"""
return map(self.text, self._data_check().text_store.get_entry(self._member))
[docs]
def image_entries(self) -> "Iterable[webcface.image.Image]":
"""このメンバーのImageをすべて取得する。"""
return map(self.image, self._data_check().image_store.get_entry(self._member))
[docs]
def views(self) -> "Iterable[webcface.view.View]":
"""このメンバーのViewをすべて取得する。
.. deprecated:: 1.1
"""
return self.view_entries()
[docs]
def view_entries(self) -> "Iterable[webcface.view.View]":
"""このメンバーのViewをすべて取得する。"""
return map(self.view, self._data_check().view_store.get_entry(self._member))
[docs]
def funcs(self) -> "Iterable[webcface.func.Func]":
"""このメンバーのFuncをすべて取得する。
.. deprecated:: 1.1
"""
return self.func_entries()
[docs]
def func_entries(self) -> "Iterable[webcface.func.Func]":
"""このメンバーのFuncをすべて取得する。"""
return map(self.func, self._data_check().func_store.get_entry(self._member))
[docs]
def canvas2d_entries(self) -> "Iterable[webcface.canvas2d.Canvas2D]":
"""このメンバーのCanvas2Dをすべて取得する。"""
return map(
self.canvas2d, self._data_check().canvas2d_store.get_entry(self._member)
)
[docs]
def canvas3d_entries(self) -> "Iterable[webcface.canvas3d.Canvas3D]":
"""このメンバーのCanvas3Dをすべて取得する。"""
return map(
self.canvas3d, self._data_check().canvas3d_store.get_entry(self._member)
)
[docs]
def log_entries(self) -> "Iterable[webcface.log.Log]":
"""このメンバーのLogをすべて取得する。(ver2.1〜)"""
return map(self.log, self._data_check().log_store.get_entry(self._member))
[docs]
def on_value_entry(self, func: Callable) -> Callable:
"""Valueが追加されたときのイベント
コールバックの引数にはValueオブジェクトが渡される。
"""
self._data_check().on_value_entry[self._member] = func
return func
[docs]
def on_text_entry(self, func: Callable) -> Callable:
"""Textが追加されたときのイベント
コールバックの引数にはTextオブジェクトが渡される。
"""
self._data_check().on_text_entry[self._member] = func
return func
[docs]
def on_image_entry(self, func: Callable) -> Callable:
"""Textが追加されたときのイベント
コールバックの引数にはTextオブジェクトが渡される。
"""
self._data_check().on_image_entry[self._member] = func
return func
[docs]
def on_view_entry(self, func: Callable) -> Callable:
"""Viewが追加されたときのイベント
コールバックの引数にはViewオブジェクトが渡される。
"""
self._data_check().on_view_entry[self._member] = func
return func
[docs]
def on_func_entry(self, func: Callable) -> Callable:
"""Funcが追加されたときのイベント
コールバックの引数にはFuncオブジェクトが渡される。
"""
self._data_check().on_func_entry[self._member] = func
return func
[docs]
def on_canvas2d_entry(self, func: Callable) -> Callable:
"""Canvas2Dが追加されたときのイベント
コールバックの引数にはCanvas2Dオブジェクトが渡される。
"""
self._data_check().on_canvas2d_entry[self._member] = func
return func
[docs]
def on_canvas3d_entry(self, func: Callable) -> Callable:
"""Canvas3Dが追加されたときのイベント
コールバックの引数にはCanvas3Dオブジェクトが渡される。
"""
self._data_check().on_canvas3d_entry[self._member] = func
return func
[docs]
def on_log_entry(self, func: Callable) -> Callable:
"""Logが追加されたときのイベント(ver2.1〜)
コールバックの引数にはLogオブジェクトが渡される。
"""
self._data_check().on_log_entry[self._member] = func
return func
[docs]
def on_sync(self, func: Callable) -> Callable:
"""Memberがsyncしたときのイベント
コールバックの引数にはMemberオブジェクトが渡される。
"""
self._data_check().on_sync[self._member] = func
return func
@property
def sync_time(self) -> datetime.datetime:
"""memberが最後にsyncした時刻を返す"""
t = self._data_check().sync_time_store.get_recv(self._member)
if t is not None:
return t
else:
return datetime.datetime.fromtimestamp(0)
@property
def lib_name(self) -> str:
"""このMemberが使っているWebCFaceライブラリの識別情報
c++クライアントライブラリは"cpp", javascriptクライアントは"js",
pythonクライアントは"python"を返す。
"""
return self._data_check().member_lib_name.get(
self._data_check().get_member_id_from_name(self._member), ""
)
@property
def lib_version(self) -> str:
"""このMemberが使っているWebCFaceのバージョン"""
return self._data_check().member_lib_ver.get(
self._data_check().get_member_id_from_name(self._member), ""
)
@property
def remote_addr(self) -> str:
"""このMemberのIPアドレス"""
return self._data_check().member_remote_addr.get(
self._data_check().get_member_id_from_name(self._member), ""
)
@property
def ping_status(self) -> Optional[int]:
"""通信速度を調べる
通信速度データをリクエストしていなければリクエストし、
sync()後通信速度が得られるようになる
:return: データがなければ None, 受信していれば pingの往復時間 (ms)
"""
self.request_ping_status()
return self._data_check().ping_status.get(
self._data_check().get_member_id_from_name(self._member), None
)
[docs]
def request_ping_status(self) -> None:
"""通信速度データをリクエストする
(ver2.0〜)
"""
if not self._data_check().ping_status_req:
self._data_check().ping_status_req = True
self._data_check().queue_msg_req([webcface.message.PingStatusReq.new()])
[docs]
def on_ping(self, func: Callable) -> Callable:
"""通信速度データが更新されたときのイベント
通信速度データをリクエストしていなければリクエストする
コールバックの引数にはMemberオブジェクトが渡される。
"""
self.request_ping_status()
self._data_check().on_ping[self._member] = func
return func