
ã¯ããã«
Toxã«ãŒãã«ïŒ githubã®toxcore ïŒã¯3ã€ã®éšåã§æ§æãããŠããŸãã
- å®éã ToxCoreã¯ã³ã¢ãã®ãã®ã§ãããé£çµ¡å ãã¡ãã»ãŒãžããã¡ã€ã«ãã¢ãã¿ãŒãã¹ããŒã¿ã¹ãã°ã«ãŒããã£ããã管çã§ããŸãã
- ToxAV-é³å£°ããã³ãããªé話ã®ãµãã·ã¹ãã ã
- ToxDNS -DNSãžã®ã¯ãšãªãä»ããŠäººéãèªããã¢ãã¬ã¹ïŒé»åã¡ãŒã«ãŸãã¯JabberIDã®é¡äŒŒç©ïŒããToxIDãååŸããããã®ãµãã·ã¹ãã ã
é£çµ¡å ãŠãããã¯ToxID ïŒAPIçšèªã§ã¯ãã¢ãã¬ã¹ãïŒ-é·ã76æåã®16é²æååã§ããšã³ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
- å ¬ééµïŒ32ãã€ããŸãã¯64æåïŒã
- ã¹ãã "nospam"ïŒ4ãã€ããŸãã¯8æåïŒã«å¯Ÿããä¿è·-ã©ã³ãã ããŒã¿ã»ããããã®å€æŽã«ããã以åã«èš±å¯ãããé£çµ¡å ãåŒãç¶ãç¶æã§ããŸãããæ°ããé£çµ¡å ããã®èŠæ±ã¯ç¡èŠã§ããŸãã
- ãã§ãã¯ãµã ïŒ2ãã€ããŸãã¯4æåïŒ-å ¬éããŒãšå€ãnospamãã®XORæäœã¯ãToxIDã®æ£ç¢ºæ§ãè¿ éã«ç¢ºèªããã®ã«åœ¹ç«ã¡ãŸãã
Tox APIã®äžè¬çãªäœæ¥ãµã€ã¯ã«ã¯ã次ã®åœ¢åŒã§é çªã«è¡šãããšãã§ããŸãã
- ã«ãŒãã«ã®åæåïŒ tox_new ïŒ-ããã§ããããã³ã«ïŒIPv4 / IPv6ãUDP / TCPïŒããããã·èšå®ïŒHTTP / SOCKS5ïŒã䜿çšããããŒãã®ç¯å²ãèšå®ãã以åã«ä¿åããç¶æ ãé£çµ¡å ã®ãªã¹ããšãšãã«ããŠã³ããŒãããŸãã
- ã€ãã³ãåŠçã®ããã®ã³ãŒã«ããã¯é¢æ°ã®èšå®ïŒ tox_callback_ * ïŒ-ã€ãã³ããã³ãã©ãŒã¯ã¡ã€ã³ã«ãŒãïŒ4ïŒããåŒã³åºãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ããžãã¯ã¯éåžžãããã«éäžããŸãã
- 1ã€ä»¥äžã®DHTããŒããžã®æ¥ç¶ïŒ tox_bootstrap ïŒã
- ã¡ã€ã³ãã¥ãŒãã£ãµã€ã¯ã«ïŒ tox_iterate ïŒããã³ã€ãã³ãåŠçã
- tox_iteration_intervalãäžæåæ¢ããåã®æé ã«æ»ããŸãã
ãªããªã Tox APIã®ç¥èãåŸãããã®äž»ãªæ¹æ³ã¯ããœãŒã¹ã³ãŒãïŒCã§èšè¿°ïŒãèªãããšã§ããããã«ãã¬ãŒã³ããŒã·ã§ã³ãåçŽåããããã«ãPythonèšèªã®ã©ãããŒïŒ githubã®pytoxcore ïŒã䜿çšããŸãã ãœãŒã¹ããã©ã€ãã©ãªã®èªå·±ã¢ã»ã³ããªãè¡ããããªã人ã®ããã«ãäžè¬çãªãã£ã¹ããªãã¥ãŒã·ã§ã³çšã®æ¢è£œã®ãã€ããªããã±ãŒãžãžã®ãªã³ã¯ããããŸãã
Pythonã©ãããŒã䜿çšããå Žåã次ã®æ¹æ³ã§ã©ã€ãã©ãªã®ãã«ããååŸã§ããŸãã
$ python >>> from pytoxcore import ToxCore >>> help(ToxCore) class ToxCore(object) | ToxCore object ... | tox_add_tcp_relay(...) | tox_add_tcp_relay(address, port, public_key) | Adds additional host:port pair as TCP relay. | This function can be used to initiate TCP connections to different ports on the same bootstrap node, or to add TCP relays without using them as bootstrap nodes. | | tox_bootstrap(...) | tox_bootstrap(address, port, public_key) | Sends a "get nodes" request to the given bootstrap node with IP, port, and public key to setup connections. | This function will attempt to connect to the node using UDP. You must use this function even if Tox_Options.udp_enabled was set to false. ...
以äžã§ã¯ãAPIãæäœããåã¹ãããã«ã€ããŠããå°ã詳ãã説æããŸãã
ã«ãŒãã«ã®åæå
ã«ãŒãã«ãåæåããããã«ã Tox_Optionsæ§é äœããã©ã¡ãŒã¿ãŒãšããŠäœ¿çšãããŸãã Pythonã§ã¯ãåãååã®ãã£ãŒã«ããæã€èŸæžã«ããããšãã§ããŸãã ããã©ã«ãå€ã¯ã tox_options_defaultã¡ãœãããåŒã³åºãããšã§ååŸã§ããŸãã
$ python >>> from pytoxcore import ToxCore >>> ToxCore.tox_options_default() {'start_port': 0L, 'proxy_host': None, 'tcp_port': 0L, 'end_port': 0L, 'udp_enabled': True, 'savedata_data': None, 'proxy_port': 0L, 'ipv6_enabled': True, 'proxy_type': 0L}
ããã«ïŒ
- ipv6_enabled -IPv6ã®å¹žããªææè ãã©ããã«å¿ããŠãTrueãŸãã¯Falseã
- udp_enabled-ãããã·ãä»ããŠäœæ¥ããå Žåãé€ããTrueã«èšå®ããããšããå§ãããŸãã UDPã¯Toxã®ãã€ãã£ããããã³ã«ã§ãã
- proxy_type-ãããã·ã®ã¿ã€ããå€ãåãããšãã§ããŸãïŒ
- TOX_PROXY_TYPE_NONE-ãããã·ã䜿çšããŸããã
- TOX_PROXY_TYPE_HTTP -HTTPãããã·ã
- TOX_PROXY_TYPE_SOCKS5 -SOCKS5ãããã·ïŒTorãªã©ïŒã
- proxy_host-ãããã·ãµãŒããŒã®ãã¹ããŸãã¯IPã¢ãã¬ã¹ã
- proxy_port-ãããã·ãµãŒããŒããŒãïŒTOX_PROXY_TYPE_NONEã«ã€ããŠã¯ç¡èŠãããŸãïŒã
- start_port-èš±å¯ãããããŒãç¯å²ã®éå§ããŒãã
- end_port-èš±å¯ãããããŒãã®ç¯å²ã®çµäºããŒãã éå§ããŒããšçµäºããŒãã0ã®å Žåãç¯å²ã䜿çšãããŸã[33445ã33545]ã ããŒãã®1ã€ã ãããŒãã®å Žåãåäžã®ãŒã以å€ã®ããŒãã䜿çšãããŸãã start_port> end_portã®å Žåããããã¯äº€æãããŸãã
- tcp_port -TCPãµãŒããŒãäžããããã®ããŒãïŒãªã¬ãŒïŒ; 0ã«èšå®ãããšããµãŒããŒã¯ç¡å¹ã«ãªããŸãã TCPãªã¬ãŒã䜿çšãããšãä»ã®ãŠãŒã¶ãŒãã€ã³ã¹ã¿ã³ã¹ãäžéããŒããšããŠäœ¿çšã§ããŸãïŒã¹ãŒããŒããŒãã®æŠå¿µïŒã
- savedata_data-ããŒãããããŒã¿ãååšããªãå Žåã¯Noneã
ã»ãšãã©ã®å Žåã savedata_dataãé€ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã¯ããã©ã«ãã§æ®ãããšãã§ããŸãã
#!/usr/bin/env python # -*- coding: utf-8 -*- import os from pytoxcore import ToxCore class EchoBot(ToxCore): def __init__(self): tox_options = ToxCore.tox_options_default() if os.path.isfile("tox.save"): with open("tox.save", "rb") as f: tox_options["savedata_data"] = f.read() super(EchoBot, self).__init__(tox_options)
æåã®èµ·åæã«ãã«ãŒãã«ã¯å ¬éããŒãšç§å¯ããŒãçæããå¿ èŠã«å¿ããŠä¿åã§ããŸãã
class EchoBot(ToxCore): ... def save_data(self): with open("tox.save", "wb") as f: f.write(self.tox_get_savedata())
ããŒã¿ã¯åžžã«ã¡ã¢ãªã«æ ŒçŽããããããå¶çºçãªé害ããä¿è·ããããã«ãå®æçã«ããŒã¿ãäžæãã¡ã€ã«ã«ä¿åããïŒæåããå Žåã¯ãã¢ãããã¯ã«ïŒã¡ã€ã³ããŒã¿ãã¡ã€ã«ã«çœ®ãæããããšããå§ãããŸãã
ãŠãŒã¶ãŒã«éä¿¡ããããã®ã¢ãã¬ã¹ã®çŸåšã®å€ãå ¬ééµãšç§å¯éµãããã³ãnospamãã®å€ã¯ã次ã®åŒã³åºãã«ãã£ãŠååŸã§ããŸãã
- tox_self_get_address-çŸåšã®ã¢ãã¬ã¹ïŒToxIDïŒã
- tox_self_get_public_keyã¯å ¬ééµã§ãã
- tox_self_get_secret_key-ç§å¯éµã
- tox_self_get_nospam / tox_self_set_nospam- ãnospamãã®å€ã®ååŸãšèšå®ã
$ python >>> from pytoxcore import ToxCore >>> core = ToxCore(ToxCore.tox_options_default()) >>> core.tox_self_get_address() '366EA3B25BA31E3ADC4C476098A8686E4EAE87B04E4E4A3A3A0B865CBB9725704189FEDAEB26' >>> core.tox_self_get_public_key() '366EA3B25BA31E3ADC4C476098A8686E4EAE87B04E4E4A3A3A0B865CBB972570' >>> core.tox_self_get_secret_key() '86003764B4C99395E164024A17DCD0ECB80363C5976FF43ECE11637FA0B683F9' >>> core.tox_self_get_nospam() '4189FEDA'
ã«ãŒãã«ã®åæååŸã tox_self_set_nameããã³tox_self_set_status_messageãåŒã³åºãããšã«ããããããã«ããã¯ããŒã ãšçœ²åããã€ã§ãèšå®ã§ããŸãã ååã¯TOX_MAX_NAME_LENGTHãè¶ ããŠã¯ãªããã眲åã¯TOX_MAX_STATUS_MESSAGE_LENGTH ïŒãã€ãåäœã®ãµã€ãºïŒãè¶ ããŠã¯ãªããŸããã ã¢ãã¿ãŒã®ã€ã³ã¹ããŒã«ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã æè¡çã«ã¯ãé£çµ¡å ã«ãã¡ã€ã«ãéä¿¡ããŸãã
ã³ãŒã«ããã¯é¢æ°ãèšå®ãã
Pythonã©ãããŒã§ã¯ããµããŒããããŠããã³ãŒã«ããã¯é¢æ°ãžã®æ¥ç¶ãèªåçã«è¡ãããŸãã ãã³ãã©ãŒèªäœã¯ToxCoreã®åå«ã®ã¡ãœããã§ããããµãã£ãã¯ã¹* _cbãæã€ããšãã§ããŸãã
class EchoBot(ToxCore): ... def tox_self_connection_status_cb(self, connection_status): if connection_status == ToxCore.TOX_CONNECTION_NONE: print("Disconnected from DHT") elif connection_status == ToxCore.TOX_CONNECTION_TCP: print("Connected to DHT via TCP") elif connection_status == ToxCore.TOX_CONNECTION_UDP: print("Connected to DHT via UDP") else: raise NotImplementedError("Unknown connection_status: {0}".format(connection_status))
ç¹å®ã®ãã³ãã©ãŒãšãã®åŒæ°ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
DHTããŒãã«æ¥ç¶ãã
DHTããŒãã¯ãIPã¢ãã¬ã¹ãããŒãçªå·ãããã³å ¬ééµã«ãã£ãŠæ±ºå®ãããŸãã DHTããŒãã®åæãªã¹ãã¯ããããžã§ã¯ãwikiã«ãããŸã ã
Tox Client Guidelinesã«ãããšãã¯ã©ã€ã¢ã³ãã¯5ç§ããšã«ãã«ãŒãã«ãæ¥ç¶ã®æåãå ±åãããŸã§å°ãªããšã4ã€ã®ã©ã³ãã ããŒããžã®æ¥ç¶ãè©Šè¡ããå¿ èŠããããŸãïŒ tox_self_connection_status_cbãåç §ïŒã ã¹ããŒã¿ã¹ãã¡ã€ã«ããããŒãããå Žåãã¯ã©ã€ã¢ã³ãã¯tox_iterateã®æåã®åŒã³åºãåŸ10ç§ä»¥å ã«æ¥ç¶ãè©Šã¿ãŠã¯ãªãããæ¥ç¶ããªãå Žåã¯äžèšã®ç©æ¥µçãªæ¥ç¶æŠç¥ãç¹°ãè¿ããŸãã
åžžã«é£çµ¡ãåãåãããšãèšç»ããŠãããããã®å Žåããããã®æšå¥šäºé ã¯å°ãè€éã«èŠããŸãã ç¬èªã®ããŒã«ã«DHTããŒããäžããããšã«ãããæ¥ç¶ã«å¿ èŠãªDHTããŒãã®æ°ãæžããããšãã§ããŸãã ããŒã«ã«ããŒããæã€ããšã®è¿œå ã®ãã©ã¹ã¯ãããŒã«ã«ããŒããšã®ç¶ç¶çãªéä¿¡ã«å ããŠãToxãããã¯ãŒã¯èªäœã®ã匷åãã§ãã
ããŒã«ã«ããŒããäžããã«ã¯ã tox-bootstrapdããŒã¢ã³ãã€ã³ã¹ããŒã«ããŠèšå®ããå¿ èŠããããŸãã toxcoreã©ã€ãã©ãªãšäžç·ã«ã¢ã»ã³ãã«ã§ããéçºè ãªããžããªãããã€ããªåœ¢åŒã§ååŸã§ããŸã ã
ããŒã¢ã³ã®æ§æã¯/etc/tox-bootstrapd.confãã¡ã€ã«ã§æå®ãããŠããã ååã«ææžåãããŠããŸã ã ããŒã¢ã³ã®èµ·åã«é¢ããè¿œå æ å ±ã¯ã察å¿ããREADMEã§å ¥æã§ããŸããtox.pkgãããžã§ã¯ãã® deb-distributionsã®å Žåã tox-bootstrapdããã±ãŒãžã®ã€ã³ã¹ããŒã«ã¯ååã§ãã ããŒã«ã«DHTããŒãã®å ¬ééµã¯ãããŒã¢ã³ã®èµ·ååŸã«ã·ã¹ãã ãã°ã§ç¢ºèªã§ããŸãã
ãããã£ãŠãDHTããŒããšãã¥ãŒãã£ãµã€ã¯ã«ãšã®æ¥ç¶ã®ç°¡ç¥ããŒãžã§ã³ã¯ã次ã®ããã«è¡šãããšãã§ããŸãã
class EchoBot(ToxCore): ... def run(self): checked = False self.tox_bootstrap("127.0.0.1", 33445, "366EA...72570") while True: status = self.tox_self_get_connection_status() if not checked and status != ToxCore.TOX_CONNECTION_NONE: checked = True if checked and status == ToxCore.TOX_CONNECTION_NONE: self.tox_bootstrap("127.0.0.1", 33445, "366EA...72570") checked = False self.tox_iterate() interval = self.tox_iteration_interval() time.sleep(interval / 1000.0)
å Žåã«ãã£ãŠã¯ãã¯ã©ã€ã¢ã³ãã¯tox_bootstrapããŸã£ããåŒã³åºããã«åäœã§ããŸãããã®ããããããã¯ãŒã¯ã®åããããŒããã£ã¹ããã¡ã€ã³å ã§å¥ã®ã¯ã©ã€ã¢ã³ããŸãã¯DHTããŒããèµ·åããå¿ èŠããããŸãã ãã®æ©èœã«ãããå°ãªããšã1人ã®ã¯ã©ã€ã¢ã³ãããããã¯ãŒã¯ã«ã¢ã¯ã»ã¹ãããªã¬ãŒã§ããå Žåãã€ã³ã¿ãŒãããã«ã¢ã¯ã»ã¹ããããå€ã®äžçãšéä¿¡ãããããããšãªããããŒã«ã«ãããã¯ãŒã¯å ã§éä¿¡ã§ããŸãã
ã€ãã³ãåŠç
åã«æžããããã«ãPythonã§ã€ãã³ããã³ãã©ãŒãæ¥ç¶ããã«ã¯ãåŸç¶ã¯ã©ã¹ã«å¿ èŠãªåŒæ°ã䜿çšããŠå¿ èŠãªã¡ãœãããè¿œå ããã ãã§ååã§ããäŸã¯ãããããDHTãããã¯ãŒã¯ã«æ¥ç¶ããã³åæããããšãã«åŒã³åºãããæ¥ç¶ç¶æ ãã³ãã©ãŒtox_self_connection_status_cbã§ãã ã
é£çµ¡å ãæäœãã
ããããä»ã®ãããã¯ãŒã¯åå è ãšå¯Ÿè©±ããã«ã¯ããããã®é£çµ¡å ãªã¹ãã«è¿œå ããå¿ èŠããããŸãã APIã®çšèªã§ã¯ãé£çµ¡å ã¯ãå人ããšåŒã°ããToxCoreã€ã³ã¹ã¿ã³ã¹ã®åç¶æéãéããŠäžæã®æŽæ°ïŒã friend_number ãïŒã§ç€ºãããŸãã
å¥ã®ã¯ã©ã€ã¢ã³ããããããé£çµ¡å ãªã¹ãã«è¿œå ããèŠæ±ãè¡ããšã tox_friend_request_cbïŒpublic_keyãmessageïŒãã³ãã©ãŒããããåŽã§åŒã³åºãããŸã ãããã§ã
- public_keyã¯å人ã®å ¬ééµã§ãã
- ã¡ãã»ãŒãž - ãããã«ã¡ã¯ãããã¯ã¢ããã§ãïŒããªã©ã®å人ããã®ã¡ãã»ãŒãž åéãšããŠç§ãè¿œå ããŸããïŒã
ãã³ãã©ãŒå ã§ã¯ã tox_friend_add_norequestãåŒã³åºããŠåéã«äººãè¿œå ããããåã«ãªã¯ãšã¹ããç¡èŠããããšãã§ããŸãã ãã以éã®ãã¹ãŠã®ã€ãã³ããã³ãã©ãŒã¯ããã¬ã³ãIDãšããŠfriend_numberã䜿çšããŸããããã¯ã tox_friend_by_public_keyãåŒã³åºãããšã§å ¬éããŒããååŸã§ããŸãã
å人ã«é£çµ¡å ãè¿œå ãããšããããåŽã§æ¬¡ã®ã€ãã³ããçºçããå ŽåããããŸãã
- tox_friend_connection_status_cbïŒfriend_numberãconnection_statusïŒ -å人ã®æ¥ç¶ç¶æ
ãå€æŽããŸããconnection_statusã¯å€ãåãããšãã§ããŸãïŒ
- TOX_CONNECTION_NONEã¯ãªãã©ã€ã³ã®åéã§ãã
- TOX_CONNECTION_TCPã¯ãªã³ã©ã€ã³ã®å人ã§ãããTCPã§æ¥ç¶ãããŠããŸãã
- TOX_CONNECTION_UDPã¯ãªã³ã©ã€ã³ã®å人ã§ãããUDPã§æ¥ç¶ãããŠããŸãã
- tox_friend_name_cbïŒfriend_numberãnameïŒ -å人ã®ããã¯ããŒã ãå€æŽããŸãã
- tox_friend_status_message_cbïŒfriend_numberãmessageïŒ -眲åãå€æŽããŸãã
- tox_friend_status_cbïŒfriend_numberãstatusïŒ -ç¶æ
ã®å€æŽãstatusã¯å€ãåãããšãã§ããŸãïŒ
- TOX_USER_STATUS_NONE-å©çšå¯èœïŒããªã³ã©ã€ã³ãïŒã
- TOX_USER_STATUS_AWAY-åºçºããŸããã
- TOX_USER_STATUS_BUSY-ããžãŒã
- tox_friend_message_cbïŒfriend_numberãmessageïŒ -å人ããã®ã¡ãã»ãŒãžã
- tox_friend_read_receipt_cbïŒfriend_numberãmessage_idïŒ -tox_friend_send_messageã«ãã£ãŠéä¿¡ãããå¥ã®ã¡ãã»ãŒãžã®åä¿¡ïŒä»¥äžãåç §ïŒã
å人ããã¡ãã»ãŒãžãåä¿¡ããéã®ãšã³ãŒãããã®å Žåã¯ãè¿ä¿¡ããã ãã§ãã
class EchoBot(ToxCore): ... def tox_friend_request_cb(self, public_key, message): self.tox_friend_add_norequest(public_key) def tox_friend_message_cb(self, friend_number, message): message_id = self.tox_friend_send_message(friend_number, ToxCore.TOX_MESSAGE_TYPE_NORMAL, message)
å人ãžã®ã¡ãã»ãŒãžã®éä¿¡ã¯ã tox_friend_send_messageã¡ãœãããåŒã³åºãããšã«ãã£ãŠè¡ãããŸãããã®ã¡ãœããã¯ãã¡ãã»ãŒãžèå¥åmessage_idãè¿ããŸããããã¯ãåå人ã«åºæã®å調ã«å¢å ããçªå·ã§ãã ãã©ã¡ãŒã¿ãšããŠããã®ã¡ãœããã¯å人ã®èå¥åãã¡ãã»ãŒãžã®ã¿ã€ããããã³ã¡ãã»ãŒãžèªäœã®ããã¹ããåãå ¥ããŸãã ã¡ãã»ãŒãžããã¹ãã«ã¯æ¬¡ã®å¶éã課ããããŸãã
- ã¡ãã»ãŒãžã空ã«ããããšã¯ã§ããŸããã
- ã¡ãã»ãŒãžã¯TOX_MAX_MESSAGE_LENGTH ïŒãã€ãïŒãã倧ããããããšã¯ã§ããŸãããé·ãã¡ãã»ãŒãžã¯éšåã«åå²ããå¿ èŠããããŸãã
å人ããã®ã¡ãã»ãŒãžã®åŠçã«æéããããå Žåã¯ããã¡ãã»ãŒãžã»ãããã€ãã³ãïŒ tox_self_set_typing ïŒãã©ã³ãã ã«éä¿¡ããããšã«ããããããã®åäœãå€æ§åã§ããŸãã
å人ã®friend_numberå€ã«ããããã€ã§ã圌ã«é¢ãã次ã®æ å ±ãååŸã§ããŸãã
- tox_friend_get_connection_status-å人ã®çŸåšã®ãããã¯ãŒã¯ã¹ããŒã¿ã¹ïŒ tox_friend_connection_status_cbã®æåŸã®å€ïŒã
- tox_friend_get_name-å人ã®çŸåšã®ããã¯ããŒã ïŒ tox_friend_name_cbã®æåŸã®å€ïŒã
- tox_friend_get_status_message-å人ã®çŸåšã®çœ²åïŒæåŸã®å€ã¯tox_friend_status_message_cbã§ã ïŒã
- tox_friend_get_status-å人ã®çŸåšã®ã¹ããŒã¿ã¹ïŒ tox_friend_status_cbã®æåŸã®å€ïŒã
- tox_friend_get_last_online-ãªã³ã©ã€ã³ã§æåŸã«è¡šç€ºãããæ¥ä»ïŒunixtimeïŒã
åéãšã®è¿œå æäœïŒ
- tox_self_get_friend_list_size-åéã®æ°ãååŸããŸãã
- tox_self_get_friend_list - friend_number人ã®å人ã®ãªã¹ããååŸããŸãã
- tox_friend_delete-é£çµ¡å ãªã¹ãããå人ãåé€ããŸãã
ããã§ã¯ãã¹ãŠãã·ã³ãã«ã§çŽæçã«èŠããŸãã ããã«ãããå°ãé£ãããªããŸãã
ãã¡ã€ã«ãæäœãã
ãã¡ã€ã«åä¿¡
å人ããããã«ãã¡ã€ã«ãéä¿¡ãããšã tox_file_recv_cbã€ãã³ããçºçããŸãïŒfriend_numberãfile_numberãkindãfile_sizeãfilenameïŒ ãããã§ã
- friend_number-å人ã®çªå·ïŒãé£çµ¡å ã®æäœããåç §ïŒã
- file_number-ãã¡ã€ã«çªå·ããã®å人ããåä¿¡ããã³éä¿¡ããããã¡ã€ã«ã®çŸåšã®ãªã¹ãå ã®äžæã®çªå·ã
- kind-ãã¡ã€ã«ã¿ã€ãïŒ
- TOX_FILE_KIND_DATA-転éããããã¡ã€ã«ã¯åçŽãªãã¡ã€ã«ã§ãã
- TOX_FILE_KIND_AVATAR-転éããããã¡ã€ã«ã¯å人ã®ã¢ãã¿ãŒã§ãã
- file_size-ãã¡ã€ã«ãµã€ãºã TOX_FILE_KIND_AVATARã®å Žå ããã¡ã€ã«ãµã€ãºã0ã®å Žåãå人ã«ã¯ã¢ãã¿ãŒãèšå®ãããŠããŸããã UINT64_MAXã«çãããã¡ã€ã«ãµã€ãºã¯ãäžæãªãã¡ã€ã«ãµã€ãºïŒã¹ããªãŒãã³ã°ïŒã瀺ããŸãã
- filenameã¯ãã¡ã€ã«ã®ååã§ãã
ããã§ã¯ã ãã¡ã€ã«åãã©ã¡ãŒã¿ã«ç¹ã«æ³šæãæãå¿ èŠããããŸãã ä»æ§ã§ã¯ãã¹ãŠã®ããŒã¿ãUTF-8ã«è»¢éããå¿ èŠããããå®éã«ã¯ãã¡ã€ã«åã«ãã¹ã®äžéšãå«ããããšã¯ã§ããŸããããå®éã«ã¯ãæ¹è¡ããŒããå«ãèªã¿åãäžèœãªãã€ããªããŒã¿ã«é£ã¶ããšããããŸãã
ãã®ã€ãã³ããçºçãããšã次ã®ãããã¢ã¯ã·ã§ã³ã¯å¶åŸ¡ã¡ãœããtox_file_controlïŒfriend_numberãfile_numberãcontrolïŒã®åŒã³åºãã«ãªããŸããããã§ã
- friend_number-å人ã®çªå·ã
- file_number-ãã¡ã€ã«çªå·ã
- control-ãã¡ã€ã«ç®¡çã³ãã³ãïŒ
- TOX_FILE_CONTROL_CANCEL-ãã¡ã€ã«ã®åä¿¡ããã£ã³ã»ã«ããŸãã
- TOX_FILE_CONTROL_PAUSE-ãã¡ã€ã«è»¢éãäžæåæ¢ããŸãïŒãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã§ãµããŒããããŠããããã§ã¯ãããŸããïŒã
- TOX_FILE_CONTROL_RESUME-ãã¡ã€ã«è»¢éãç¶è¡ããŸãã
ãšã³ãŒãããã®å Žåããã¡ã€ã«ã®åä¿¡ã¯å¿ èŠãªããããæäœããã€ã§ããã£ã³ã»ã«ã§ããŸãã
class EchoBot(ToxCore): ... def tox_file_recv_cb(self, friend_number, file_number, kind, file_size, filename): self.tox_file_control(friend_number, file_number, ToxCore.TOX_FILE_CONTROL_CANCEL)
TOX_FILE_CONTROL_RESUMEãä»ããŠå¶åŸ¡ã転éããå Žåã tox_file_recv_chunk_cbïŒfriend_numberãfile_numberãpositionãdataïŒã€ãã³ããéå§ããŸã ãããã§ã
- friend_number-å人ã®çªå·ã
- file_number-ãã¡ã€ã«çªå·ã
- position-ãã¡ã€ã«å ã®çŸåšã®äœçœ®ã
- data-転éãçµäºããããŒã¿ãã£ã³ã¯ãŸãã¯Noneã
ããã§ã¯ã äœçœ®ãå調ã«å¢å ããå¿ èŠããªããšããäºå®ã«æ³šæãæãå¿ èŠããããŸããäžè¬ã«ããã£ã³ã¯ã¯ä»»æã®é åºã§ä»»æã®é·ãã«ãªããŸãã
ãã¡ã€ã«è»¢é
ãã¡ã€ã«è»¢éæé ãéå§ããã«ã¯ã tox_file_sendã¡ãœããïŒfriend_numberãkindãfile_sizeãfile_idãfilenameïŒãåŒã³åºãå¿ èŠããããŸã ãããã§ã
- friend_number-å人ã®çªå·ã
- kind -value TOX_FILE_KIND_DATAãŸãã¯TOX_FILE_KIND_AVATAR
- file_size-ãã¡ã€ã«ãµã€ãºïŒç¹å¥ãªå€0ããã³UINT64_MAXã¯äžèšã§èª¬æãããŠããŸãïŒã
- file_id-é·ãTOX_FILE_ID_LENGTHã®ãã¡ã€ã«ã®äžæã®èå¥åãããã«ãããã«ãŒãã«ã®åèµ·ååŸã転éãç¶è¡ã§ããŸããèªåçæã®å Žåã¯Noneã§ãã
- filenameã¯ãã¡ã€ã«ã®ååã§ãã
ããã§ã®ç¹å¥ãªãã©ã¡ãŒã¿ãŒã¯file_idã§ãã èªåçæã®å Žåã¯ããã®åŸtox_file_get_file_idãåŒã³åºãããšã§ååŸã§ããŸãããã¢ãã¿ãŒã転éãããšãã¯ãã¢ãã¿ãŒãã¡ã€ã«ã®ããŒã¿ããtox_hashãåŒã³åºããçµæã«å€ãèšå®ããããšããå§ãããŸããããã«ãããåä¿¡è ã¯ä»¥åã«ããŒãããã¢ãã¿ãŒã®è»¢éããã£ã³ã»ã«ããŠãã©ãã£ãã¯ãç¯çŽã§ããŸãã
ãŸãããã¡ã€ã«è»¢éã¯ããããã¯ãŒã¯ã«æ¥ç¶ããŠããå人ã«ã®ã¿å¯èœã§ããããšã«æ³šæããå¿ èŠããããŸãã å人ããããã¯ãŒã¯ããåæãããšããã¡ã€ã«è»¢éãåæ¢ããŸãã
tox_file_sendãåŒã³åºããåŸãã«ãŒãã«ã¯ãã¹ãããã®æ±ºå®ãåŸ ã¡ãŸãã ãœãªã¥ãŒã·ã§ã³ã¯ã tox_file_recv_control_cbïŒfriend_numberãfile_numberãcontrolïŒã€ãã³ãã«ãã£ãŠåŠçãããŸããããã§ã
- friend_number-å人ã®çªå·ã
- file_number-ãã¡ã€ã«çªå·ã
- control-ãã¡ã€ã«ç®¡çã³ãã³ãïŒ åè¿°ã®TOX_FILE_CONTROL_CANCEL ã TOX_FILE_CONTROL_PAUSEãŸãã¯TOX_FILE_CONTROL_RESUME ïŒã
ãã®ã€ãã³ããåŠçãããšãã¯ã©ã€ã¢ã³ãããã¡ã€ã«ã®åãå ¥ããæåŠããå Žåã«ãªãœãŒã¹ã解æŸã§ããŸãã
ãšã³ãŒãããã¯ã¢ãã¿ãŒãéä¿¡ããã ãã§ãã ã¢ãã¿ãŒã®è»¢éã¯ãå人ããããã¯ãŒã¯ã«çŸãããã³ã«è¡ãããšããå§ãããŸãã å人ã®toxã¯ã©ã€ã¢ã³ãããæå®ãããfile_idã§ã¢ãã¿ãŒã以åã«ã¢ããããŒãããå Žåãã¢ãã¿ãŒã®åéä¿¡ããã£ã³ã»ã«ã§ããŸãã
class EchoBot(ToxCore): ... def __init__(self): ... self.avatar_name = "avatar.png" self.avatar_size = os.path.getsize(avatar_name) self.avatar_fd = open(avatar_name, "rb") data = self.avatar_fd.read() self.avatar_id = ToxCore.tox_hash(data) def tox_friend_connection_status_cb(self, friend_number, connection_status): if connection_status != ToxCore.TOX_CONNECTION_NONE: send_avatar(friend_number) def send_avatar(self, friend_number): file_number = self.tox_file_send(friend_number, ToxCore.TOX_FILE_KIND_AVATAR, self.avatar_size, self.avatar_id, self.avatar_name) def tox_file_recv_control_cb(self, friend_number, file_number, control): pass def tox_file_chunk_request_cb(self, friend_number, file_number, position, length): if length == 0: return self.avatar_fd.seek(position, 0) data = self.avatar_fd.read(length) self.tox_file_send_chunk(friend_number, file_number, position, data)
ã¡ãã»ãŒãžãšãã¡ã€ã«ã®éåä¿¡ã«å ããŠãã«ãŒãã«ã¯ãã±ããã転éããæ©èœãå®è£ ããŠããŸãïŒæ倱ã®æç¡ã«ãããããïŒã ãããè¡ãã«ã¯ãtox_friend_send_lossy_packetããã³tox_friend_send_lossless_packetã¡ãœãã ãããã³tox_friend_lossy_packet_cbããã³tox_friend_lossless_packet_cbã€ãã³ãã䜿çšããŸã ã
åç §è³æ
- tox.chat- ïŒtox.imã§ã¯ãªãïŒToxãããžã§ã¯ãã®çŸåšã®å ¬åŒãµã€ãã
- githubã®toxcoreã«ãŒãã«ãããžã§ã¯ã ã
- githubã®Pytoxcore pythonã©ãããŒãããžã§ã¯ã ã
- githubã§tox.pkgã¯ã©ã€ã¢ã³ããšã©ã€ãã©ãªã®ãã€ããªããŒãžã§ã³ãæ§ç¯ãããããžã§ã¯ãã
- githubã®ãå ¬åŒãpythonã©ãããŒPyToxã®ãããžã§ã¯ãïŒå·çæç¹ã§ã¯ããå€ããapiã䜿çšããŠãããããã©ã€ãã©ãªã¯ã³ã³ãã€ã«ãããŸããã§ããïŒã