訊號

此功能從 evennia 0.9 及更高版本開始可用

您可以透過多種方式將自己的功能插入 Evennia 中。 最常見的方法是透過 hooks - typeclasses 上的方法 在特定事件中被呼叫。當你想要一個遊戲實體時,Hooks 是很棒的選擇 當事情發生時以某種方式行事。 _訊號_補充 當您想要輕鬆附加新功能而無需使用掛鉤的情況下 覆蓋 typeclass 上的內容。

當 Evennia 發生某些事件時,會觸發_Signal_。這個想法是 您可以將任意數量的事件處理程式「附加」到這些訊號。您可以附上 任意數量的處理程式,只要任何實體觸發,它們都會觸發 訊號。

Evennia使用Django訊號系統

使用訊號

首先建立你的處理程式


def myhandler(sender, **kwargs):
  # do stuff

**kwargs 是強制性的。然後將其附加到您選擇的訊號上:

from evennia.server import signals

signals.SIGNAL_OBJECT_POST_CREATE.connect(myhandler)

此特定訊號在帳戶連線到遊戲(發布)後觸發。 發生這種情況時,myhandler 將觸發,sender 是剛剛連線的帳戶。

如果您只想回應特定實體的影響,您可以這樣做 像這樣:

from evennia import search_account
from evennia import signals

account = search_account("foo")[0]
signals.SIGNAL_ACCOUNT_POST_CONNECT.connect(myhandler, account)

可用訊號

所有訊號(包括一些 django 特定的預設值)都在模組中可用 evennia.server.signals (使用快捷方式evennia.signals)。訊號按傳送者型別命名。所以SIGNAL_ACCOUNT_* 回報 Account 例項作為寄件人,SIGNAL_OBJECT_* 傳回 Objects 等。額外關鍵字 (kwargs) 應該 從訊號處理程式中的 **kwargs 字典中提取。

  • SIGNAL_ACCOUNT_POST_CREATE - 這在 Account.create() 的最後觸發。注意 呼叫evennia.create.create_account(由Account.create內部呼叫)將 不是 觸發此訊號。這是因為使用 Account.create() 預計是最常用的 使用者在登入時自行建立帳戶的方式。它透過並額外 kwarg ip 連結帳戶的用戶端IP。

  • SIGNAL_ACCOUNT_POST_LOGIN - 當帳戶經過身份驗證時,這將始終觸發。 傳送 涉及新的 Session 物件的額外 kwarg session

  • SIGNAL_ACCCOUNT_POST_FIRST_LOGIN - 這會在 SIGNAL_ACCOUNT_POST_LOGIN 之前觸發,但僅 如果 這是完成的第一個連線(也就是說,如果沒有先前的 sessions 連線)。還有 將 session 作為 kwarg 傳遞。

  • SIGNAL_ACCOUNT_POST_LOGIN_FAIL - 當有人嘗試登入帳戶失敗時傳送。 通行證 session 作為額外的 kwarg。

  • SIGNAL_ACCOUNT_POST_LOGOUT - 當帳戶登出時總是觸發,無論其他sessions 留下或不留下。將斷開連線 session 作為 kwarg 傳遞。

  • SIGNAL_ACCOUNT_POST_LAST_LOGOUT - 在 SIGNAL_ACCOUNT_POST_LOGOUT 之前觸發,但前提是這是 最後 Session 中斷該帳戶的連線。將 session 作為 kwarg 傳遞。

  • SIGNAL_OBJECT_POST_PUPPET - 當帳戶操縱此物件時觸發。額外的 kwargs session account 代表傀儡實體。 SIGNAL_OBJECT_POST_UNPUPPET - 當傳送物件未被操縱時觸發。額外的 kwargs 是 sessionaccount

  • SIGNAL_ACCOUNT_POST_RENAME - 由Account.username的設定觸發。額外透過 夸克old_namenew_name

  • SIGNAL_TYPED_OBJECT_POST_RENAME - 當任何 Typeclassed 實體的 key 變更時觸發。 額外 傳遞的 kwargs 是 old_keynew_key

  • SIGNAL_SCRIPT_POST_CREATE - 在任何鉤子之後首次建立 script 時觸發。

  • SIGNAL_CHANNEL_POST_CREATE - 在任何鉤子之後首次建立 Channel 時觸發。

  • SIGNAL_HELPENTRY_POST_CREATE - 首次建立幫助條目時觸發。

  • SIGNAL_EXIT_TRAVERSED - 當穿過出口時觸發,就在 at_traverse 鉤子之後。 sender 是出口本身,traverser= 關鍵字儲存遍歷出口的出口。

evennia.signals 模組還可讓您輕鬆存取預設的 Django 訊號(這些 使用一個 不同的命名約定)。

  • pre_save - 在任何儲存之前觸發任何資料庫實體的 .save 方法時觸發 發生了。

  • post_save - 儲存資料庫實體後觸發。

  • pre_delete - 在刪除資料庫實體之前觸發。

  • post_delete - 刪除資料庫實體後觸發。

  • pre_init - 在 typeclass’ __init__ 方法之前觸發(依序 發生在 at_init 鉤子觸發之前)。

  • post_init - 在 __init__ 末尾觸發(仍在 at_init 掛鉤之前)。

這些是高度專業化的 Django 訊號,對大多數使用者來說不太可能有用。但是 為了完整起見,將它們包含在此處。

  • m2m_changed - 在多對多欄位(如 db_attributes)更改後觸發。

  • pre_migrate - 在資料庫遷移以 evennia migrate 開始之前觸發。

  • post_migrate - 資料庫遷移完成後觸發。

  • request_started - 當 HTTP 請求開始時傳送。

  • request_finished - 當 HTTP 請求結束時傳送。

  • settings_changed - 因 @override_settings 更改設定時傳送 裝飾器(僅與單元測試相關)

  • template_rendered - 當測試系統呈現http模板時傳送(僅對單元測試有用)。

  • connection_creation - 與資料庫初始連線時傳送。