File size: 3,931 Bytes
bd36d21
 
 
 
 
 
 
 
53e7f37
 
c7ea683
 
 
ae0554f
53e7f37
 
 
ae0554f
53e7f37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a080c7
53e7f37
 
 
 
 
 
 
 
 
3a080c7
c7ea683
 
 
 
 
 
 
 
 
 
 
 
3a080c7
c7ea683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a080c7
c7ea683
 
 
 
 
 
 
 
 
 
 
 
3a080c7
53e7f37
d14a2df
 
53e7f37
6fcd547
c7ea683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a080c7
c7ea683
31c7a45
c7ea683
 
 
 
3a080c7
c7ea683
bd36d21
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import os
import json
import requests
from fastapi import Request
import websockets
import asyncio
from huggingface_hub import webhook_endpoint

# Speckle stream and authentication information
speckle_token = os.getenv("SPECKLE_TOKEN")
api_url = "https://speckle.xyz/graphql"
stream_id = "1dab2d05eb"
branch_name = "scenario_sycer"

# WebSocket URI
ws_uri = "wss://onlinewebsocketserver.onrender.com"
websocket = None

# Connect to WebSocket
async def connect():
    global websocket
    try:
        websocket = await websockets.connect(ws_uri)
        print("Connected to the WebSocket server")
    except Exception as e:
        print(f"Connection failed: {e}")

async def send_data(data):
    global websocket
    if websocket is None or websocket.closed:
        await connect()
    if websocket is None or websocket.closed:
        print("Failed to connect to WebSocket server.")
        return

    try:
        await websocket.send(json.dumps(data))
        print(f"Sent: {data}")
        response = await websocket.recv()
        response_data = json.loads(response)
        print(f"Received: {response_data}")
    except Exception as e:
        print(f"Failed to send or receive data: {e}")
        websocket = None

def send_graphql_query(speckleToken, apiUrl, query):
    headers = {
        "Authorization": f"Bearer {speckleToken}",
        "Content-Type": "application/json",
        "Accept": "application/json"
    }
    response = requests.post(apiUrl, headers=headers, json={"query": query})
    if response.status_code == 200:
        return response.json()
    else:
        print(f"HTTP Error: {response.status_code}, {response.text}")
        return None

def construct_commit_query(stream_id, branch_name):
    return f"""
    {{
      stream(id: "{stream_id}") {{
        branch(name: "{branch_name}") {{
          commits(limit: 1) {{
            items {{
              id
              message
              referencedObject
            }}
          }}
        }}
      }}
    }}
    """

def fetch_referenced_object(speckleToken, apiUrl, stream_id, object_id):
    query = f"""
    {{
      stream(id: "{stream_id}") {{
        object(id: "{object_id}") {{
          id
          data
        }}
      }}
    }}
    """
    return send_graphql_query(speckleToken, apiUrl, query)

@webhook_endpoint
async def update_streams(request: Request):
    payload = await request.json()
    print(f"Received webhook payload: {payload}")

    commit_query = construct_commit_query(stream_id, branch_name)
    result = send_graphql_query(speckle_token, api_url, commit_query)

    if result and 'data' in result:
        commit_data = result['data']['stream']['branch']['commits']['items'][0]
        referenced_object_id = commit_data['referencedObject']
        print(f"Referenced Object ID: {referenced_object_id}")

        object_data = fetch_referenced_object(speckle_token, api_url, stream_id, referenced_object_id)
        if object_data:
            print(json.dumps(object_data, indent=2))

            # Extract the 'data' field, which is a JSON string
            nested_data_str = object_data['data']['stream']['object']['data']['data']

            # Parse the JSON string to a dictionary
            nested_data = json.loads(nested_data_str)

            # Access the 'teamName' field
            team_name = nested_data.get('teamName', 'N/A')
            print(f"Team Name: {team_name}")

            # Send the team name to the WebSocket server
            await send_data(team_name)
        else:
            print("Failed to retrieve the referenced object data.")
    else:
        print("Failed to retrieve commit data.")

    return "Data sent successfully!"

# Uncomment below if you want to use Gradio for a manual interface
"""
import gradio as gr
iface = gr.Interface(
    fn=update_streams,
    inputs=gr.components.Button(value="Update Streams"),
    outputs="text",
)
iface.launch()
"""